从Rails中的ActiveRecord :: RecordNotFound获取额外信息

时间:2012-01-12 02:13:15

标签: ruby-on-rails activerecord

我在application_controller.rb处理RecordNotFound错误如下:

  rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found

  private 

   def record_not_found
     flash[:error] = "Oops, we cannot find this record"
     redirect_to :back
   end

但是我希望获得更多信息,例如找不到哪条记录的类/表名。 我应该怎么做呢?

谢谢。

4 个答案:

答案 0 :(得分:3)

您可以在救援处理程序中定义参数,并在那里传递异常。

def record_not_found exception
  flash[:error] = "Oops, we cannot find this record"
  # extract info from exception

  redirect_to :back
end

如果您无法从例外中获取该信息,那么您运气不好(我认为)。

答案 1 :(得分:2)

比如说,

begin
@user = User.find(params[:id])
rescue ActiveRecord::RecordNotFound
  flash[:notice] = "#No such record in User for id :: {params[:id]} on #{action_name}"
end

<强>更新

flash[:notice] = t('flash.recordnotfound',:class_name => self.class.name, :column_name => params[:id], :action_name => action_name)

现在在config/locales/en.yml(这有助于翻译,请参阅i18n here

flash:
  recordnotfound:  "Sorry, no record od %{column_name} in class %{class_name} was found on you action %{action_name}"

如果您不想使用区域设置,只需在flash[:notice]本身中提供此信息。

更有活力?

编写一个函数并在那里使用相同的flash [:notice]。一点都不疼。

想要更多数据?

这是一个快速的解决方案,我总是<%= params%>在我看来很容易知道最新情况和最新情况。然后,您可以打开rails控制台并播放不同的操作等等。

user = User.new
user.save
user.errors.messages

我认为所有这些都是足够好的数据。

祝你好运。

答案 2 :(得分:2)

我在这方面取得了一些成功:

# in app/controllers/application_controller.rb

rescue_from ActiveRecord::RecordNotFound, with: :record_not_found

def record_not_found exception
  result = exception.message.match /Couldn't find ([\w]+) with 'id'=([\d]+)/
  # result[1] gives the name of the model
  # result[2] gives the primary key ID of the object that was not found
end

HTH

编辑:在正则表达式结束时删除了空格错误。感谢评论者。 :)

答案 3 :(得分:0)

实例化模型后,您可以查看类似的内容。

human = Human.new
human.errors

在rails控制台中查看此内容,以便您可以使用它并在主控制器中使用它。

rescue_from ActiveRecord::RecordNotFound do |exception|
    raise ActiveRecord, exception.message, exception.backtrace
end

修改 确保应用程序控制器扩展基础。

class ApplicationController < ActionController::Base
 rescue_from Exception, :with => :record_not_found
  private 

   def record_not_found(e)
     flash[:error] = "Oops, we cannot find this record" + e.message
     redirect_to :back
   end
end