如何在 "index" 页面和 "show" 页面中渲染略有不同的部分

How to render slightly difference partial in "index" page and "show" page

有一个模型 Company 有很多 DailyDatum

我想在companies/:id/daily_datadaily_data/index中显示每日数据。但是在公司页面我不想显示company.name列。

views/daily_data/_daily_datum.html.erb

<tr>
  <td><%= daily_datum.company.name %></td>
  # This company.name needs to be shown when the partial is called from daily data index.
  <td><%= daily_datum.column1 %></td>
  <td><%= daily_datum.column2 %></td>
</tr>

views/daily_data/index.html.erb

<table>
  <thead>
  <tr>
    <th>Company Name</th>
    <th>Daily Datum1</th>
    <th>Daily Datum2</th>
  </tr>
  </thead>
  <%= render @daily_data %>
</table>

views/companies/daily_data.html.erb

<table>
  <thead>
  <tr>
    <!--<th>Company Name</th>-->
    <th>Daily Datum1</th>
    <th>Daily Datum2</th>
  </tr>
  </thead>
  <%= render @daily_data %>
</table>

遇到这种情况应该怎么处理?我是否需要创建另一个部分 HTML?

这可能有点矫枉过正,因为您只是尝试有条件地呈现一个字段,但“正确”方法是创建一个助手。

我建议创建一个助手,根据 path.

有条件地呈现 @daily_data 的两个部分之一

companies_helper.rb

def is_companies_index_path?
  current_page?(companies_index_url)
end

def is_companies_show_path?
  current_page?(companies_show_url)
end

def render_appropriate_partial
  render 'daily_data_a' if is_companies_index_path?
  render 'daily_data_b' if is_companies_show_path?
end

然后在你的视图中你可以简单地调用:

<% render_appropriate_partial %>

它会根据 route/url 你的位置呈现适当的部分。

您可以使用 Routing Paramters 来了解当前 action/controller 是什么,因此您可以根据 if 条件选择是否添加公司名称。

<% if action_name == 'index' && controller_name == 'daily_data' %>
  <th>Company Name</th>
<% end %>