如何从index.html.erb中的联接表中访问数据?

时间:2013-07-10 05:13:25

标签: ruby-on-rails ruby

我有一个Rails 4应用程序,有两个型号Campus和Stat。 Campus has_many stats和Stat belongs_to Campus。

我遇到的问题是我可以在我的show动作中使用Campus表中的数据,但不能在我的索引操作中。这是控制器的相关代码。

  def index
    @stats = Stat.all
  end

  def show
  end

这是我的show.html.erb:

<p id="notice"><%= notice %></p>
<p>
  <strong>Attendance:</strong>
  <%= @stat.attendance %>
</p>
<p>
  <strong>Salvations:</strong>
  <%= @stat.salvations %>
</p>
<p>
  <strong>Visitors:</strong>
  <%= @stat.visitors %>
</p>
<p>
  <strong>Offering:</strong>
  <%= @stat.offering %>
</p>
<p>
  <strong>Campus:</strong>
  <%= @stat.campus.name %>
</p>
<p>
  <strong>Date:</strong>
  <%= @stat.date %>
</p>
<%= link_to 'Edit', edit_stat_path(@stat) %> |
<%= link_to 'Back', stats_path %>

输出以下内容:

出席率:23

救助:0

访客:3

提供:5000.0

校园:Revelstoke

日期:2013-07-05

编辑|回到

这是我的index.html.erb的相关部分:

<% @stats.each do |stat| %>
  <tr>
    <td><%= stat.attendance %></td>
    <td><%= stat.salvations %></td>
    <td><%= stat.visitors %></td>
    <td><%= stat.offering %></td>
    <td><%= stat.date %></td>
    <td><%= stat.time %></td>
    <td><%= stat.campus.name %></td>
    <td><%= link_to 'Show', stat %></td>
    <td><%= link_to 'Edit', edit_stat_path(stat) %></td>
    <td><%= link_to 'Destroy', stat, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>

输出为nil提供了一个未定义的方法`name':stat.campus.name的NilClass

我无法弄清楚为什么会有区别。我做错了什么?

2 个答案:

答案 0 :(得分:1)

您的数据库中似乎有一个statcampus没有关联。

要查看其中的一个,您可以转到rails console并查看campus_id属性,打印Stat.all

如果您以编程方式添加统计信息,或者您添加的表单没有每个模型属性,就会发生这种情况。

如果您不希望这种情况发生,可以在模型中使用validatesCheck this link

答案 1 :(得分:0)

首先,你没有在show action中初始化@stat,你可以这样做:

@stat = Stat.find(params[:id])

其次,您必须确保@stat校园与校园相关联。但是,由于您没有索引问题,您的统计信息似乎与校园相关联,这意味着状态有一列campus_id,该值是表campuses的有效ID。

更新

在阅读您的评论后,您的统计信息没有与校园相关联,您可以在以下情况下显示空字符串:

  <td><%= stat.campus.try(:name) %></td>