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

时间:2013-02-16 16:59:54

标签: ruby-on-rails ruby-on-rails-3 validation rails-activerecord

我有一个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.

提前致谢

2 个答案:

答案 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::RecordInvalidgithub

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