我有以下节目动作:
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
变量有关,但我该如何解决?
答案 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)
当然可以。有两个原因:
所以你应该将救援线移到方法的底部,例如:
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时会出现错误