nil的未定义方法:NilClass错误

时间:2013-10-21 08:27:54

标签: ruby-on-rails ruby-on-rails-3

我收到的未定义方法`site_name'为nil:NilClass 错误,以下内容。非常感谢任何帮助。我正在尝试列出Site表中的site_name,我不确定如何最好地解决问题。

class Site < ActiveRecord::Base
      attr_accessible :site_id, :site_name, :region

      has_many :trials, :foreign_key => "site_id"

    end

    class Trial < ActiveRecord::Base
      attr_accessible :trial_id, :site_id, :year, :trial_type

      scope :year, ->(year) { where(year: year) }
      scope :trial_id, ->(trial_id) { where(trial_id: trial_id) }

      belongs_to :site

    end

我的控制器:

class TrialsController < ApplicationController

  def index
    @years = Trial.group('year').order('year DESC')
    end

  def trial
    @trial = Trial.trial_id(params[:trial_id])
  end

**def list
@list = Trial.year(params[:year]).order(:region_id).joins(:sites).where('sites.site_id' => :site_id)

端**

end

我的观点:

    <% @list.each do |list| %>
        <tr>
        <td>
      <%= link_to list.site.site_name, trial_trials_path(trial_id: list.trial_id) %>
        </td>
        <td>    
        <%= link_to list.trial_type, trial_trials_path(trial_id: list.trial_id) unless list.trial_type.blank? %>
        </td>
        <td>    
        <%= link_to list.trial_type, trial_trials_path(trial_id: list.trial_id) %>
        </td>
        <td>    
        <%= link_to list.planted_at, trial_trials_path(trial_id: list.trial_id) unless list.planted_at.blank? %>
        </td>
        <td>    
        <%= link_to list.picked_at, trial_trials_path(trial_id: list.trial_id) unless list.picked_at.blank? %>
        </td>
        </tr>
        <% end %>

3 个答案:

答案 0 :(得分:1)

如果您只是将行更改为:

,该怎么办?

<%= link_to list.site.site_name, trial_trials_path(trial_id: list.trial_id) if list.site.try(:site_name) %>

此外,您可以在Rails控制台中执行Site.where(site_name: nil)以查看哪个站点没有名称。

答案 1 :(得分:0)

即使没有列表网站,如果你不想要粉碎页面,也可以尝试使用这个

list.site.try(:site_name)

但我认为您应该使用其他流程,例如

  1. 不要在没有网站的情况下创建列表。
  2. 不列出没有网站的列表。

答案 2 :(得分:0)

您必须决定您的默认网站名称,例如。 "Example.com"。然后你只需在nil上定义它:

def nil.site_name
  "Example.com"
end

错误将消失。