Ruby on Rails:为从搜索结果中找到的每个用户呈现部分表单

Ruby on Rails: render partial form for each user found from search results

是否可以为我作为搜索结果获得的每个用户呈现来自共享部分的表单?

所以当我搜索 adam 时,我会得到如下内容:

Adam1 [按照表格]

Adam2 [按照表格]

Adam3 [按照表格]

其中follow form是一个follow按钮,保存了一个关系到数据库,所以每个按钮都必须正确发送一个对应的user id。 以下所有机制等都正常工作,您可以在访问他的个人资料时关注用户,但我现在实现了对用户的搜索,并且在获得结果时,我还希望表单位于每个结果的旁边。

我相信我需要做这样的事情:

<% for result in @results do
  render result
  render follow_form
%>

<% @results.each do |f|
  render f
  render follow_form for f
%>

但我不太确定该怎么做。 即使我设法呈现用户,我也无法呈现他们旁边的表单。由于某种原因,@user 容器为 nil。

这些是搜索控制器和共享表单的文件:

class SearchController < ApplicationController

  def search
    query = "%#{params[:query]}%"
    @users = User.where("name LIKE ? ", query)
  end

end

搜索视图

<%= render 'shared/search_bar' %>
<ul class="users follow">
  <%= @users.each do |f| %>
    <%= render f %>
    <%= render 'shared/endorse_form' if logged_in? %>
    <% end %>
</ul>

在此处的视图 /\ 中,渲染 f 正确地渲染了用户,但也在包含用户数据的结果下方渲染了一些看起来像数据库转储的东西。当我添加 render shared/endorse_form 时,我收到有关 nil:NilClass 的空 class undefined methodid' 的错误 在 follow(endorse) 表格的第 2 行,如下所示:

<%= form_for(current_user.active_endorsements.build, remote: true) do |f| %>
  <div><%= hidden_field_tag :endorsed_id, @user.id %></div>
  <%= f.submit "Endorse", class: "btn btn-primary" %>
  <%= f.text_field :comment, class: 'form-control' %>
<% end %>

如何处理?任何帮助将不胜感激。

所有代码都可以在 https://bitbucket.org/kramarz/pracainzynierska

问题是实例变量(如 @user)不会自动传递给部分变量,因此在您的 endorse_form 中,部分变量 @usernil。 (此外,@user 实际上并不是您想要的对象——您想要使用在每次 @users.each 迭代中产生的对象。)解决方案是使用 locals 选项,它让您告诉 render,您希望部分变量可用以及它们的名称应该是什么:

<%= @users.each do |user| %>
  <%= render user %>
  <%= render partial: 'shared/endorse_form', locals: { endorsed_user: user } if logged_in? %>
<% end %>

我在这里做了两件事。首先,我将 f 重命名为 user,因为 f 作为用户对象的名称没有实际意义。 (在 Rails 视图中,f 通常指的是一个 FormBuilder 对象,因为它屈服于您传递给 form_for 的块。)

其次,我添加了选项locals: { endorsed_user: user }。这告诉 render, "I want there to be a local variable named endorsed_user that I can use in the partial, and I want its value to be the value of user," 这是 each.

迭代产生的用户对象

然后,在您的 endorse_form 部分中,您将使用局部变量 endorsed_user 而不是实例变量 @user:

<%= form_for(current_user.active_endorsements.build, remote: true) do |f| %>
  <div><%= hidden_field_tag :endorsed_id, endorsed_user.id %></div>
  <%= f.submit "Endorse", class: "btn btn-primary" %>
  <%= f.text_field :comment, class: 'form-control' %>
<% end %>