Получите дополнительную информацию от ActiveRecord :: RecordNotFound в Rails - PullRequest
4 голосов
/ 12 января 2012

Я обработал ошибку RecordNotFound в моем application_controller.rb следующим образом:

  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 ]

3 голосов
/ 12 января 2012

Вы можете определить параметр в вашем обработчике спасения, и исключение будет передано туда.

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

  redirect_to :back
end

Если вы не можете получить эту информацию из исключения, вам не повезло (я думаю).

2 голосов
/ 24 августа 2015

У меня был некоторый успех с этим:

# 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

РЕДАКТИРОВАТЬ: ошибка пробела удалена в конце регулярного выраженияСпасибо комментаторам.:)

2 голосов
/ 12 января 2012

Скажем, например,

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 здесь )

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

Если вы не хотите использовать локали, просто поместите эту информацию в flash[:notice].

Более динамично?

Напишите функцию и используйте ту же вспышку [: note].Не повредит вообще.

хотите больше данных?

Вот быстрое решение, я всегда <%= params%> в своих взглядах, чтобы легко знать, что происходит и что происходит.Затем вы можете открыть консоль rails и поиграть с различными действиями и т. Д.

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

Все это достаточно хорошие данные, я думаю.

Удачи.

0 голосов
/ 12 января 2012

Как только вы создадите экземпляр модели, вы можете проверить что-то вроде.

human = Human.new
human.errors

Проверьте это в консоли rails, чтобы вы могли поиграть с ней и использовать ее в главном контроллере.

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

EDIT Убедитесь, что контроллер приложения расширяет базу.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...