【问题标题】:undefined method for nil:NilClass errornil 的未定义方法:NilClass 错误
【发布时间】:2013-10-21 08:27:54
【问题描述】:

我收到一个 undefined method `site_name' for 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 %>

【问题讨论】:

  • 也许您的列表条目中只有一个没有站点?
  • 我正在尝试从站点数据库访问 site_name。

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


【解决方案1】:

如果你把这行改成这样会怎样:

&lt;%= link_to list.site.site_name, trial_trials_path(trial_id: list.trial_id) if list.site.try(:site_name) %&gt;

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

【讨论】:

  • 以上没有运气。感谢您回复本杰明。
  • 在条件句上犯了一个小错误。请重试。
  • 不再出现错误,但它也没有列出任何内容,空白。我是否必须在我的控制器中调用 Site 以及 '@list = Trial.year(params[:year]).order(:region_id)' 变量?
【解决方案2】:

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

list.site.try(:site_name)

但我认为你应该使用另一个流程,比如

  1. 不要让创建没有站点的列表。
  2. 不要列出没有网站的列表。

【讨论】:

  • 这种方法仍然没有运气。
【解决方案3】:

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

def nil.site_name
  "Example.com"
end

错误就会消失。

【讨论】:

  • 这种方法有效,但是,我怎样才能最好地选择相应的站点名称,其中sites.site_name = trial_site_id?我似乎在将两张表连接在一起时遇到了麻烦。
  • 我不是 Rails 专家,我提供的解决方案只是一个 hack,一个快速的组合。为您的问题找到真正好的解决方案超出了我的能力范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
相关资源
最近更新 更多