拯救“未定义的方法'xyz'为nil:nilClass”错误

时间:2012-12-20 12:17:32

标签: ruby-on-rails ruby

我有以下节目动作:

def show
  @name = params[:id]
  rescue ActiveRecord::RecordNotFound
  redirect_to :action => 'index'     
  @rpm = FedoraRpm.find_by_name(@name, :include => :rpm_comments)
  @page_title = @rpm.name
end

即使我在那里添加了救援声明,但它似乎无法正常工作,当我尝试查看不存在的网址时出现此错误:

undefined method 'name' for nil:NilClass

我知道这可能与@page_title变量有关,但我该如何解决?

2 个答案:

答案 0 :(得分:5)

@rpm = FedoraRpm.find_by_name(@name, :include => :rpm_comments)
如果无法找到结果,

将返回nil。这可能是你的情况。然后,您尝试在nil对象上调用name

如果您希望查询返回nil值,请确保相应地更改代码。

救援声明在那里没有任何意义。如果您想在使用时丢失记录时重定向

def show
  @name = params[:id]
  @rpm = FedoraRpm.find_by_name!(@name, :include => :rpm_comments)
  @page_title = @rpm.name
rescue ActiveRecord::RecordNotFound
  redirect_to :action => 'index'     
end

注意我使用了发现者的爆炸版本。

@rpm = FedoraRpm.find_by_name!(@name, :include => :rpm_comments)

答案 1 :(得分:2)

当然可以。有两个原因:

  1. 您使用的救援声明是在发生错误或可能发生错误的地方之前
  2. 您指向特殊类型的错误 ActiveRecord :: RecordNotFound 只有在您使用查找方法或添加时才会被触发!在 find_by_name
  3. 的末尾

    所以你应该将救援线移到方法的底部,例如:

    def show
      @name = params[:id]
      @rpm = FedoraRpm.find_by_name!(@name, :include => :rpm_comments)
      @page_title = @rpm.name
    rescue ActiveRecord::RecordNotFound
      redirect_to :action => 'index'     
    end
    

    注意我添加了!标记到find_by_name的末尾,它会触发找不到记录的异常,在你的情况下它会返回 nil ,所以当你试图从nil获取.name时会出现错误