从Exception返回消息中删除"验证失败"消息

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.

提前致谢

Jon*_*ess 9

在"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让我觉得它也可以在那里工作.

  • 上帝感谢你。这是带有异常处理的应用程序级别配置的正确答案。在Rails 5.2.2中工作。快速说明,如果有人想包含相关属性,请将格式更改为`format:“%{attribute}%{message}” (2认同)

Clu*_*ter 8

有效时?在任何模型上调用(从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)