【问题标题】:Passing an instance variable into a form - rails将实例变量传递给表单 - rails
【发布时间】: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


【解决方案1】:

你可以这样做:

<% 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

编辑

您可能需要将 @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? 并确保阅读有关如何将变量正确传递给部分的内容。你可以使用&lt;%= debug &lt;variablename&gt; %&gt;来调试你的视图

【讨论】:

  • 感谢您指出我在遵循 Ruby 最佳实践和构建喜欢的位置时遇到的一些问题。这些是我在学习 rails 时很难跟上的主题。我已经用“编辑 2”更新了我的问题,以包括我的喜欢!方法。不幸的是,我仍然只能在单个帖子的页面上提交点赞,而在带有帖子提要的个人资料上,“like[liked_post_id]”的表单数据中会发送一个空白值
  • 看起来您没有正确地将 post 变量传递给您的 _like_form 或 _like 。尝试使用 检查 post 变量。如果隐藏字段中确实存在值,还要检查表单标记。
  • 表单标记是我的确切问题。在帖子页面上:&lt;input id="like_liked_post_id" name="like[liked_post_id]" type="hidden" value="73" /&gt; 在提要页面上:&lt;input id="like_liked_post_id" name="like[liked_post_id]" type="hidden" /&gt; 在哪里更正帖子变量?
猜你喜欢
  • 1970-01-01
  • 2018-11-07
  • 2014-10-15
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多