2013-02-10 36 views
3

这可能是一个错误,因为我对Rails的最少理解以及如何在模型中使用变量,所以如果需要更多的代码来回答它或者我的术语不正确,让我知道,我会很乐意更新这个问题。传递一个实例变量到一个表格 - 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变量_like.html.erb

我注意到,相同形式的行为是/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 
... 

@弗兰克 - 暴雪已经指出,我的形式标记是一个问题。在帖子的页面生成的标记是:

<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" /> 
+0

来调试您的视图_likes_的创建应该在控制器中完成。 – 2013-02-11 01:16:56

+0

@代码源,请参阅上面的“编辑1:”,_like_正在类似的控制器中创建。 – 2013-02-13 16:32:29

回答

8

你可以做这样的事情:

<% 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!方法,所以我猜你已经在用户模型中实现了一些方法来实现这一点。如果你不喜欢在你可以访问params[:like]的LikesController的create动作中构建你的喜欢。

def create 
    @post = Post.find(params[:like][:post_id]) 
    current_user.likes.build(@post) 
    # ... 
    end 

编辑

您可能需要正确地传递你的@post变量到您的_like_form谐音,象这样:

#views/posts/_post.html.erb: 
... 
<% if signed_in? %> 
    <%= render 'posts/like_form', :post => @post %> 
<% end %> 
... 

这会给你存取要求里面的一个post变量部分,所以你可以预先填充你的表格值与它的ID。请参阅此问题以及Pass a variable into a partial, rails 3?并确保阅读如何正确地将变量传递给部分。您可以使用<%= debug <variablename> %>

+0

感谢您指出我遵循Ruby最佳实践和构建喜欢的位置的一些问题。这些是我在学习铁轨时很难跟上的主题。我已用“编辑2”更新了我的问题,以包含我的喜欢!方法。 不幸的是,我仍然只能在单个帖子的页面上提交一个类似的内容,而在包含帖子提要的配置文件中,空白值会以“like [liked_post_id]”的形式发送数据“ – 2013-02-13 16:41:40

+1

看起来像您不要将post变量正确地传递给_like_form或_like。尝试使用<%= debug @post%>检查post变量。还要检查您的表单标记,如果您的隐藏字段中存在真正的值。 – tmaximini 2013-02-13 17:46:08

+0

表单标记是我确切的问题。 在帖子的页面上:'' 在feed页面:'' 我在哪里可以更正帖子变量? – 2013-02-13 17:57:58