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