Ruby on rails 将变量传递给rails部分

Ruby on rails 将变量传递给rails部分,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我有一个表,用于显示与某些团队成员关联的客户机数量。每个表的代码基本上是相同的,所以我想我应该用一些局部变量传递给它的部分来干燥它 这是原始代码 <thead> <tr> <th>Name </th> <th>Clients </th> </tr> </thead> <tbody> <% @strategists.each do

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

这是原始代码

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

这导致了的一个nil类错误

这也会导致edit_战略家_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>

名称
客户
2 %>   
这是桌子。多亏了@margo,我最终找到了方法发送,这让我发现了多态路径,解决了必须通过编辑团队成员路径的主要问题。我可以动态地构造它,而不是传递它

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

| 
这就是我在索引页面上为每个团队成员调用partial的地方(显然在需要的地方更改变量)@达拉姆指出,我使用的是@stratearator而不是@stratearators,这使我能够正确地呈现我的收藏,并强调了我的关键问题

<%= 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,
  }%>


代码现在运行得很好,谢谢大家的帮助

我认为您需要将
@战略家
分配给
团队成员\u global
,而不是
@战略家


另外,
edit\u straller\u path
希望将
straller
传递给它,以便它可以从中推断出生成路径所需的
id
。它是一个方法,因此如果您将其作为字符串传递,它将不会生成路径。

您的问题不清楚分部适合何处,您在何处使用变量和字符串。您可能需要使用rails的一个助手和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,请给它一个战略家.id。

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

此外,由于要渲染集合,因此可以使用以下命令替换循环:

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

# Within _team_member_index partial:
<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?' } %>
#在_团队_成员_索引部分中:
| 
这将更加干净,而且无需传递单个变量

最后,为了保持一致性,我建议将您的部分重命名为_战略家,或者该部分所代表的记录的名称

集合一开始可能有点混乱,但它功能强大,确实有助于保持视图干净和简单

这里有更多好信息:

感谢您帮助我突出我的问题,我现在已经设法使一切正常。如果你感兴趣,你可以查看我的更新。嘿,谢谢你为我指明发送的方向,它引导我走向多态链接的正确道路。我现在一切正常,如果你有兴趣,请查看我的更新。谢谢你关于使用收藏的建议。我现在一切正常,如果你有兴趣,请查看我的更新。