我有一个ActiveRecord模型帐户:
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
现在e.message总是返回:验证失败:Msisdn用户已经注册,我应该如何仅仅获取消息,例如用户已经注册。请注意,我根本不使用视图,我想从控制器中使用它,我正在使用Rails 3.
提前致谢
答案 0 :(得分:9)
向“config / locale / en.yml”添加两件事:
en:
activerecord:
errors:
messages:
record_invalid: "%{errors}"
errors:
format: "%{message}"
(或您支持的任何语言的相应翻译文件)。
注意:这是在rails 5中测试的,但对rails 3 docs的快速扫描让我觉得它也可以在那里工作。
答案 1 :(得分:8)
有效时?在任何模型上调用(从create / save / update_attributes发生)它会在模型上填充错误对象。 当然如果您使用bang方法(创建!),那么分配将永远不会发生,因此请使用非爆炸方法。请参阅第3个代码段。
account = Account.new(:msisdn => user)
unless account.save #
# account.errors will be populated with errors
puts account.errors[:msisdn] # => ['User Already Registered']
end
使用爆炸方法替代
account = Account.new(:msisdn => user)
begin
account.save!
rescue Exception
puts account.errors[:msisdn]
end
编辑:
查看rails api文档之后的另一个选择是在存储副本时从异常中获取记录。这使我的原始陈述失败。
ActiveRecord::RecordInvalid (github)
begin
account = Account.create!(:msisdn => user)
rescue ActiveRecord::RecordInvalid => e
puts e.record.errors[:msisdn] # => ['User Already Registered']
end