将变量传递给rails部分

时间:2016-03-29 19:36:41

标签: ruby-on-rails ruby-on-rails-4

我有一个表格,用于显示与某些团队成员相关联的客户端数量。每个表的代码基本相同,所以我想我会用局部变量传递给它来干掉它。

这是原始代码。

<thead>
    <tr>
      <th>Name </th>
      <th>Clients </th>
    </tr>
  </thead>
  <tbody>
    <% @strategists.each do |strategist| %>
      <tr>
        <td><%=link_to strategist.name, strategist %> </td>
        <td><%=strategist.clients.count%> </td>
        <td> <%= link_to 'Edit', edit_strategist_path(strategist) %> | <%= link_to 'Destroy', strategist, method: :delete, data: { confirm: 'Are you sure?' } %>

      </td>
    <% end %> 
  </tbody>

所以我试图用更通用的形式替换,我可以将变量传递给。

<table class="table table-striped">
  <thead>
    <tr>
      <th>Name </th>
      <th>Clients </th>
    </tr>
  </thead>
  <tbody>
    <% team_member_global.each do |team_member| %>
      <tr>
        <td><%=link_to team_member.name, team_member %> </td>
        <td><%=team_member.clients.count%> </td>
        <td> <%= link_to 'Edit', edit_team_member_path(team_member) %> | <%= link_to 'Destroy', team_member, method: :delete, data: { confirm: 'Are you sure?' } %>

      </td>
    <% end %> 
  </tbody>
</table>

这是呈现部分的代码。

<%= render partial: "shared/team_member_index", locals: {
  team_member_global: @strategist,
  new_team_member: "New Strategist",
  new_team_member_path: new_strategist_path,
  edit_team_member_path: edit_strategist_path
  }%>

这导致我对&lt;%team_member_global.each do | team_member |的nil类错误%GT;

它还会导致edit_strategist_path想要[:id]时出错,但如果我将其作为字符串传递则无法找到路径。

传递这些变量的正确方法是什么?

更新

遵循下面列出的建议以及跟进一些线索,这就是结果。

这是每个团队成员的索引页面的共享部分。我使用@ anthony-e建议使用集合来输出我的表格。

<h1 class="page-header"> <%=team_member_capitalised%> </h1>
<div class="table-responsive">
<table class="table table-striped">
  <thead>
    <tr>
      <th>Name </th>
      <th>Clients </th>
    </tr>
  </thead>
  <tbody>
    <%= render partial: "shared/team_member_table", collection: team_member_global, as: :team_member, locals: {team_members: team_member_global} %>
  </tbody>
</table>        
</div>
<%= paginate team_member_global, :window => 2 %>   
<div id="link_button">
<%= link_to new_team_member, new_team_member_path, class: "btn btn-default", role: "button"  %>
</div>

这是表的局部。感谢@margo,我最终走上了查看方法发送的路径,这导致我发现了多态路径,这解决了必须通过edit_team_member_path的主要问题。我可以动态地构建它,而不是通过它。

<tr>
  <td><%=link_to team_member.name, team_member %> </td>
  <td><%=team_member.clients.count%> </td>
  <td> <%= link_to 'Edit', edit_polymorphic_path(team_member) %> | <%= link_to 'Destroy', team_member, method: :delete, data: { confirm: 'Are you sure?' } %>
</tr>

这是我在每个团队成员的索引页面上调用部分内容(显然在需要时更改变量)。 @dharam指出我使用@strategist而不是@strategists,它允许正确渲染我的收藏,并突出显示我的关键问题。

<%= render partial: "shared/team_member_index", locals: {
    team_member: @strategist,
  team_member_capitalised: "Strategist",
  team_members_path: strategists_path,
  team_member_global: @strategists,
  new_team_member: "New Strategist",
  new_team_member_path: new_strategist_path,
  }%>

现在代码工作正常,感谢大家的帮助!

3 个答案:

答案 0 :(得分:2)

我认为您需要将@strategists分配给team_member_global,而不是@ strategist

同样edit_strategist_path期望strategist传递给它,以便它可以从中推导id,这是生成路径所必需的。这是一种方法,因此如果您将其作为字符串传递,它将无法生成路径。

答案 1 :(得分:1)

你的问题不清楚部分适合哪里,你在哪里使用变量和字符串。您可能需要使用rails'help之一并使用send来从您传入的类名构造路径。

<% @strategists.each do |strategist| %>
  <%= render partial: "shared/team_member_index", locals: {
    team_member_global: strategist, 
    new_team_member: "New Strategist",
    new_team_member_path: new_strategist_path,
    edit_team_member_path: edit_strategist_path
  }%>

如果该方法要求输入id,请将其命名为strategist.id。

答案 2 :(得分:1)

您可以做很多事情来简化代码。首先,您不需要传递任何这些变量,因为它们会在您针对该请求的所有视图中共享。

此外,由于您正在渲染集合,因此您可以使用以下代码替换您的循环:

$.post( templateUrl + "templates/template2.html", 
      { preHeader: "something", Header: "something" }, 
      function( data ) {
         alert("Post successful");
      });

现在,名为= render partial: "shared/team_member_index", collection: @strategists, as: :strategist 的变量将传递给strategist中每个元素的部分,如下所示:

@strategists

这将更加清晰,无需传递单个变量。

最后,为了保持一致性,我建议将部分重命名为_strategist,或者部分代表的记录名称。

收集起初可能有点令人困惑,但功能超强,可以帮助保持视图干净简洁。

这里有一些更好的信息: https://robots.thoughtbot.com/rendering-collections-in-rails http://guides.rubyonrails.org/layouts_and_rendering.html