评论和投票路线



我有两个可以评论的模型,图书和电影。

评论是可投票的

在我的路线文件中:

resources :books, :path => '' do
resources :comments do
member do
post :vote_up
end
end

在我的评论控制器:

class CommentsController < ApplicationController
def create
book.comments.create(new_comment_params) do |comment|
comment.user = current_user
end
redirect_to book_path(book)
end
private
def new_comment_params
params.require(:comment).permit(:body)
end
def book
@book = Book.find(params[:book_id])
end
def vote_up
begin
current_user.vote_for(@comment = Comment.find(params[:id]))
render :nothing => true, :status => 200
rescue ActiveRecord::RecordInvalid
render :nothing => true, :status => 404
end
end
end

在我看来:

<%= link_to('vote for this post!', vote_up_book_comment_path(comment), 
:method => :post) %>

我不断得到这个错误:

No route matches {:action=>"vote_up", :controller=>"comments", :id=>nil, :book_id=>#<Comment id: 
3, body: "fantastic read!", book_id: 113, created_at: "2014-02-15 17:08:10", updated_at: 
"2014-02-15 17:08:10", user_id: 8>, :format=>nil} missing required keys: [:id]

这是我用于投票的宝石:https://github.com/bouchard/thumbs_up

评论可以属于书籍或电影,我该如何在路线中设置?此外,我如何在路线中设置投票?(所有评论均可投票)

如果运行rake routes,您可能会在输出中得到一行内容如下:

vote_up_book_comment POST   /:book_id/comments/:id/vote_up(.:format) comments#vote_up

特别注意这一部分——它告诉你vote_up_book_comment_path方法期望什么作为参数:

/:book_id/comments/:id/vote_up(.:format)

此外,您的错误消息会给您一些提示:

No route matches ...
:id=>nil, :book_id=>#<Comment id: 3 ...
missing required keys: [:id]

路径助手需要一个id(用于注释)和一个book_id,并且它们被要求的顺序显示在rake routes中(先是book_id然后是id)。

因此,总的来说,您需要将book传递给vote_up_book_comment_path:

<%= link_to('vote for this post!', vote_up_book_comment_path(@book, comment), :method => :post) %>

因为您在路由中使用member,rails需要url中的id。在vote_up_book_comment_path(comment)中,您提供了bookid,但没有commentid。它将comment参数解释为一本书。要解决此问题,请包含一个book对象,将vote_up_book_comment_path(comment)更改为vote_up_book_comment_path(@book, comment)。在控制器的new方法中,还包括book变量,以便视图模板可以访问它。

在书籍或电影中设置评论:

因为评论与书籍或视频是分开的,所以你不想把它们放在书下面。相反,将注释作为一个单独的路由,并且只有当您是newedit时,才将路由嵌套在书籍或视频下。这样,您就可以在视图模板中有一个隐藏字段,存储书籍或视频,然后将其传递给控制器。现在控制器有必要的信息来知道它是book_id还是movie_id

它在代码中看起来像这样:

resources :books do
resources :comments, only: [:new, :edit]
end

你会为你想要的所有资源做这件事。最后,对于评论,你可以这样做:

resources :comments, except: [:new, :edit]

相关内容

  • 没有找到相关文章

最新更新