Ruby on Rails 3投票系统上的路由错误

时间:2011-07-31 16:19:11

标签: ruby-on-rails ruby ruby-on-rails-3 routing

我想要添加的是一个按钮,当按下时,将“准确度”值增加1.我看了很多很多StackOverflow解决方案,但到目前为止它们都没有对我有用。我正在使用同事的代码,如果有帮助,大部分内容都来自Ruby on Rails教科书(“通过示例学习Rails”),可能会被黑客攻击。

我的观点如下:

  <%= 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"}

1 个答案:

答案 0 :(得分:0)

你正在使用CanCan gem,它显然没有给你必要的授权。查看详细信息:

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请求,因为用户可能会通过刷新页面等多次意外地提交它们。