2

我有以下表演动作:

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

即使我在那里添加了救援语句,它似乎也不起作用,当我尝试查看不存在的 URL 时出现此错误:

undefined method 'name' for nil:NilClass

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

4

2 回答 2

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

如果找不到结果,则返回 nil。这可能是你的情况。然后,您尝试调用name一个 nil 对象。

如果您希望查询返回 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

注意我使用了 bang 版本的取景器。

@rpm = FedoraRpm.find_by_name!(@name, :include => :rpm_comments)
于 2012-12-20T12:21:50.510 回答
2

你肯定会的。有2个原因:

  1. 您使用的救援语句在错误发生或可能发生的地方之前
  2. 您指向特殊类型的错误ActiveRecord::RecordNotFound,只有当您使用find方法或添加 ! 在find_by_name的末尾

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

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 时会遇到错误

于 2012-12-20T12:22:13.340 回答