1

У меня есть модель счета ActiveRecord:Удаление «Не удалось выполнить проверку» Сообщение от обратного Exception сообщения

class Account < ActiveRecord::Base 

    attr_accessible :msisdn 

    validates_uniqueness_of :msisdn, :on => :create, 
    :message => "User Already Registered ." 
end 

И у меня есть контроллер, который пытаются создать учетную запись:

begin 
    account = Account.create!(:msisdn => user) 
rescue Exception => e 
    $LOG.error "Account #{user} : --> #{e.message}" 
end 

теперь е. message always return: Не удалось выполнить проверку: Msisdn Пользователь уже зарегистрирован, как я должен просто получить сообщение только как Пользователь уже зарегистрировался. Пожалуйста, обратите внимание, что я не использую взгляды на все, я хочу, чтобы использовать его из контроллера, и я использую Rails 3.

Заранее спасибо

ответ

7

Когда действует? вызывается на любой модели (которая происходит из create/save/update_attributes), она заполняет объект ошибки на модели. Конечно, если вы используете метод bang (create!), Тогда назначение никогда не произойдет, поэтому вместо этого используйте метод non bang. См. Третий фрагмент кода.

account = Account.new(:msisdn => user) 
unless account.save # 
    # account.errors will be populated with errors 
    puts account.errors[:msisdn] # => ['User Already Registered'] 
end 

Альтернатива с использованием метода BANG

account = Account.new(:msisdn => user) 
begin 
    account.save! 
rescue Exception 
    puts account.errors[:msisdn] 
end 

Edit:

Другой вариант после глядя на рельсы API Docs, чтобы получить запись из исключения, как он хранит копию. Это делает мое первоначальное утверждение ложным.

ActiveRecord::RecordInvalid (github)

begin 
    account = Account.create!(:msisdn => user) 
rescue ActiveRecord::RecordInvalid => e 
    puts e.record.errors[:msisdn] # => ['User Already Registered'] 
end 
5

Добавить две вещи "конфигурации/локаль/en.yml":

en: 
    activerecord: 
    errors: 
     messages: 
     record_invalid: "%{errors}" 
    errors: 
    format: "%{message}" 

(или соответствующие файлы перевода на языки в зависимости от того вы случайно поддержки) ,

Примечание: это было протестировано в рельсах 5, но быстрое сканирование рельсов 3 документа заставляет меня думать, что он тоже будет работать.

Смежные вопросы