这可能是一个错误,因为我对 Rails 以及如何跨模型使用变量的了解很少,所以如果需要更多代码来回答它或者我的术语不正确,请告诉我,我会很乐意更新问题。
我有一个帖子提要,我希望用户能够“喜欢”。虽然下面的代码允许喜欢在单个帖子的页面上工作 - site.com:3000/posts/*post.id*
- 传递表单数据like[liked_post_id]:*post.id*
,当我尝试在site.com:3000/users/*user.id*
包含帖子提要的配置文件上提交喜欢时 - 传递的表单数据是like[liked_post_id]:
(空白价值)
如何将帖子提要中的帖子 ID 传递给liked_post_id
变量 in _like.html.erb
?
我注意到类似表格的动作是/likes
全面的。这只会在您在页面上时起作用site.com:3000/posts/*post.id*
吗?我很好奇我是否需要修改它以便表单的动作是/posts/*post.id*/likes
当你在页面上时site.com:3000/users/*user.id*
从我的帖子来看:
#views/posts/_post.html.erb:
...
<%= render 'posts/like_form' if signed_in? %>
...
路线到正确的形式:
#views/posts/_like_form.html.erb:
<div id="like_form">
<% if current_user.likes_this?(@post) %>
<%= render "posts/unlike" %>
<% else %>
<%= render "posts/like" %>
<% end %>
</div>
喜欢来自:
#views/posts/_like.html.erb
<%= form_for Like.new, :remote => true do |f| %>
<%= f.hidden_field :liked_post_id, :value => @post.id %>
<%= f.submit "Like" %>
<% end %>
从个人资料(帖子的提要):
#views/users/show.html.erb
...
<%= render @posts %>
...
喜欢控制器:
#controllers/likes_controller.rb
class LikesController < ApplicationController
before_filter :signed_in_user
def create
@post = Post.find(params[:like][:liked_post_id])
current_user.like!(@post)
respond_to do |format|
format.html { redirect_to root_url }
format.js
end
end
...
用户型号:
#models/user.rb
...
def like!(post)
likes.create!(liked_post_id: post.id)
end
...
@frank-blizzard 指出我的表单标记是一个问题。在帖子页面上,生成的标记是:
<input id="like_liked_post_id" name="like[liked_post_id]" type="hidden" value="73" />
在提要页面上:
<input id="like_liked_post_id" name="like[liked_post_id]" type="hidden" />