【问题标题】:Removing "Validation failed" message from Exception return message从异常返回消息中删除“验证失败”消息
【发布时间】:2013-02-01 11:53:31
【问题描述】:

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

提前致谢

【问题讨论】:

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


    【解决方案1】:

    什么时候有效?在任何模型上调用(从 create/save/update_attributes 发生)它会在模型​​上填充错误对象。 当然,如果您使用 bang 方法(创建!),那么分配将永远不会发生,因此请改用非 bang 方法。 请参见第三个代码 sn-p。

    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
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 上帝谢谢你。这是具有异常处理的应用程序级配置的正确答案。在 Rails 5.2.2 中工作。快速注意,如果有人想包含有问题的属性,请将格式更改为 format: "%{attribute} %{message}"
      猜你喜欢
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 2013-02-13
      • 2014-01-22
      • 1970-01-01
      • 2022-06-10
      • 2016-12-22
      • 2013-02-01
      相关资源
      最近更新 更多