【发布时间】:2013-01-25 23:21:47
【问题描述】:
这可能是一个错误,因为我对 Rails 以及如何跨模型使用变量了解甚少,所以如果需要更多代码来回答它或者我的术语不正确,请告诉我,我会很乐意更新问题.
我有一个帖子供稿,我希望用户能够“点赞”。虽然以下代码允许喜欢在单个帖子的页面上工作 - site.com:3000/posts/*post.id* - 通过 like[liked_post_id]:*post.id* 传递的表单数据,但当我尝试在个人资料 - site.com:3000/users/*user.id* 上提交喜欢时 - 其中包含帖子的提要,传递的表单数据为like[liked_post_id]:(空值)
如何将帖子提要中的帖子 ID 传递给 _like.html.erb 中的 liked_post_id 变量?
我注意到like表单的action是/likes。只有当您在页面site.com:3000/posts/*post.id* 上时,这才有效吗?我很好奇是否需要修改它,以便当您在页面site.com:3000/users/*user.id* 上时表单的操作为/posts/*post.id*/likes
从我的帖子来看:
#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" />
【问题讨论】:
-
likes的创建应该在控制器中完成。
-
@Code-Source,参见上面的“编辑 1:”,like 正在类似控制器中创建。
标签: ruby-on-rails-3 forms instance-variables