当我使用此链接时:
<%= link_to "upvote", post_upvote_path(post), method: :put %>
我收到错误:
未定义的方法`likes_by&#39;为零:NilClass 这是因为没有正确分配方法upvote中的变量@post。
def upvote
@post = current_post
@post.liked_by current_user
redirect_to @post
end
private
def current_post
current_user.posts.find_by(id: params[:id])
end
私有方法current_post在此控制器内的其他方法中正常工作。但是,在这种方法中它并没有。例如,如果我使用:
def upvote
@post = Post.first
@post.liked_by current_user
redirect_to @post
end
相反,它会工作正常,除了它将首先发布的部分而不是单击链接的部分。解决这个问题的正确方法是什么?如何正确分配此变量以适用于单击upvote链接的帖子?
rake routes | grep posts
输出:
我注意到这个方法有/ posts /:post_id ...而其他人使用:id。这可能是问题,我该如何改变呢?
答案 0 :(得分:1)
在你的link_to中你传递的帖子......是在@posts循环的上下文中吗?投票完成后你在哪个页面上?
试试这个:
def upvote
puts "params: #{params.inspect}"
@post = Post.find(params[:id]) # if this isn't working check out that puts statement in the stack trace
@post.liked_by current_user
redirect_to post_path(@post)
end
答案 1 :(得分:0)
有
post_upvote /posts/:post_id/upvote
而非post_upvote /posts/:id/upvote
post_upvote_path( post)
在您的控制器中,由于您在路径文件中所写的内容,您想要params[:post_id]
而不是params[:id]
def current_post
current_user.posts.find_by(id: params[:post_id]) #post_upvote /posts/:post_id/upvote
end
答案 2 :(得分:0)
我发现了问题所在。在路径文件中,我需要嵌套成员方法,如下所示:
resources :posts do
member do
put 'upvote', to: 'posts#upvote'
end
end
然后将视图更改为:
<%= link_to "upvote", upvote_post_path(post), method: :put %>
控制器中的这个方法工作正常:
def upvote
@post = Post.find(params[:id])
@post.liked_by current_user
end
答案 3 :(得分:-1)
此:
<%= link_to "upvote", post_upvote_path(post), method: :put %>
应该成为:
<%= link_to "upvote", post_upvote_path(@post), method: :put %>