这可能是一个错误,因为我对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
变量?
我注意到同类表单的动作是/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暴雪指出,我的表单标记是一个问题。在帖子的页面上,生成的标记是:
<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" />
您可以这样做:
<% form_for Like.new, :remote => true do |f| %>
<%= f.hidden_field :post_id, :value => @post.id %>
<%= f.submit %>
<% end %>
current_user.likes.build(...)
部分应该离开您的视野,进入您的控制器。您使用的是current_user.like!
方法,所以我想您已经在用户模型中实现了一些方法来实现这一点。如果没有在LikesController的create
操作中建立你的点赞,你可以访问params[:like]
。
def create
@post = Post.find(params[:like][:post_id])
current_user.likes.build(@post)
# ...
end
EDiT
您可能需要将@post变量正确地传递到_like_form部分中,如下所示:
#views/posts/_post.html.erb:
...
<% if signed_in? %>
<%= render 'posts/like_form', :post => @post %>
<% end %>
...
这将使您可以访问分部中的post
变量,这样您就可以用它的id预填充表单值。也请参阅以下问题。将变量传递到分部中,rails 3?并确保阅读如何正确地将变量传递给分部。您可以使用<%= debug <variablename> %>
调试视图