2011-07-31 49 views
1

我试图添加的按钮是一个按钮,当按下时,将“准确”值递增1.我查看了很多很多StackOverflow解决方案,但没有一个他们迄今为止为我工作。我正在和一位同事的代码一起工作,如果有帮助,大部分代码都是从Ruby on Rails教程中获取的(“通过示例学习Rails”),并且可能会被黑客入侵。Ruby on Rails 3投票系统上的路由错误

我的看法是这样的:

<%= link_to 'Accurate2', :action => :vote_up, :id => @post.id%> 

我的代码如下所示:

def vote_up 
    #in posts_controller.rb 
    @post = Post.find(params[:id]) 
    @post.rate_it(1, current_user.id) #with "acts_as_rateable" plugin 
    @post.save 

我的路由是这样的:

resources :users do 
    resources :comments 
    resources :posts 
end 

resources :posts do 
    resources :comments 
    match "vote_up", :on => :collection 
    match "vote_down", :on => :collection 
end 

我收到的错误是:

http://localhost:3000/posts/vote_up?id=1 

CanCan::AccessDenied in PostsController#vote_up 

You are not authorized to access this page. 
Parameters: 

{"id"=>"1"} 
+0

似乎它与CanCan gem有关。将有助于知道你是如何使用它。 –

回答

0

您使用的CanCan创业板显然不会给您必要的授权。检查本作的细节:

https://github.com/ryanb/cancan/wiki/defining-abilities

此外,作为旁注,我会建议改变这些:

match "vote_up", :on => :collection 
match "vote_down", :on => :collection 

到:

member do 
    post "vote_up" 
    post "vote_down" 
end 

,并使得在视图中进行适当的更改:

<%= button_to 'Vote up', {:action => :vote_up, :id => @post.id} %> 

原因是这样的行为不应该用GET请求来完成,因为用户可能通过刷新页面等意外多次提交它们。

+0

这很有趣,谢谢指出。这是我的一位同事的代码。他安装了这个gem来区分用户和管理员。 – Jon

+0

这里应该使用'member'而不是'collection'。 – PeterWong

+0

不错,谢谢你指出。 –