我有一个表格,用于显示与某些团队成员相关联的客户端数量。每个表的代码基本相同,所以我想我会用局部变量传递给它来干掉它。
这是原始代码。
<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,
}%>
现在代码工作正常,感谢大家的帮助!
答案 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