Rails访问关联属性问题

时间:2017-08-10 16:40:31

标签: ruby-on-rails activerecord

我有一个html表,其呈现部分如下

<tbody id="horse_logs">
  <%= render @horse_logs %>
</tbody>

这会调用_horse_log.html.erb并遍历@horse_logs

中的每个元素
<tr id="<%= dom_id(horse_log) %>">
  <td><%= horse_log.id %></td>
  <td><%= horse_log.name %></td>
  <td><%= horse_log.boarder.first_name%></td> <!-- This is the association I want to access -->
  <td><%= horse_log.arrival_date %></td>
  <td><%= horse_log.monthly_boarding_fee %></td>
  <td><%= link_to '<i class="link blue large id card icon"></i>'.html_safe, horse_log_path(horse_log)%></td>
  <td><%= link_to '<i class="link green large edit icon"></i>'.html_safe, edit_horse_log_path(horse_log), remote: true %></td>
  <td><%= link_to '<i class="link red large remove icon"></i>'.html_safe, horse_log_path(horse_log), method: :delete, :data => {:confirm => 'Are you sure?'}, remote: true %></td>
</tr>

问题是访问partial内部的边界关联会产生以下错误

undefined method `first_name' for nil:NilClass

所以基本上rails的实现方式,他们似乎正在剥离关联数据。正确地在我的模型中建立了关联,我可以通过除局部内部以外的所有其他方式访问数据。

如何强制rails包含整个关联。

这是我的控制器方法,如果这有帮助

def index
  @horse_logs = HorseLog.all.paginate(:page => params[:page], :per_page => 9).order("created_at DESC")
  @horse_log = HorseLog.new
end

2 个答案:

答案 0 :(得分:0)

可能有更好的方法来做到这一点,但我会尝试。

<tbody id="horse_logs">
  <% @horse_log.each do |horse_log| %>
    <%= render 'horse_logs', horse_log: horse_log %>
  <% end %>
</tbody>

如果您收到相同的错误,则需要确保正确设置了关联。

每个horse_log都有boarder吗?如果没有,每次运行此代码时都会出现此错误。您需要检查hourse_log.boarder是否为零。

答案 1 :(得分:0)

要快速解决问题,请尝试此操作。它将防止错误并正常返回

<td><%= horse_log.try(&:boarder).try(&:first_name) %></td>