5

我有一个 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 总是返回 : Validation failed: Msisdn User Already Registered,我怎么能像User Already Registered这样单独获取消息。请注意,我根本没有使用视图,我想从控制器中使用它,并且我使用的是 Rails 3。

提前致谢

4

2 回答 2

13

在“config/locale/en.yml”中添加两件事:

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

(或您碰巧支持的任何语言的相应翻译文件)。

注意:这是在 rails 5 中测试的,但是快速浏览 rails 3 文档让我认为它也可以在那里工作。

于 2017-06-01T23:46:23.347 回答
8

什么时候有效?在任何模型上调用(从 create/save/update_attributes 发生)它会在模型​​上填充错误对象。当然,如果您使用 bang 方法(创建!),那么分配将永远不会发生,因此请改用非 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

编辑:

查看 rails api 文档后的另一种选择是从异常中获取记录,因为它存储了一个副本。这使我原来的陈述是错误的。

ActiveRecord::RecordInvalid ( github )

begin
  account = Account.create!(:msisdn => user)
rescue ActiveRecord::RecordInvalid => e
  puts e.record.errors[:msisdn] # => ['User Already Registered']
end
于 2013-02-16T18:01:44.367 回答