2014-11-21 33 views
3

我用在我的模型下面的代碼中插入一個鏈接到一個驗證錯誤信息使用的屬性:Rails的自定義驗證錯誤信息在另一種模式

class Bar < ActiveRecord::Base 
    has_many :foos 
    validate :mode_matcher 

    def mode_matcher 
    self.foos.each do |f| 
     errors[:base] << mode_mismatch(foo) unless foo.mode == "http" 
    end 
    end 

    def mode_mismatch(f) 
    foo_path = Rails.application.routes.url_helpers.foo_path(f) 
    "Foo <a href='#{foo_path}'>#{f.name}</a> has the wrong mode.".html_safe 
    end 

它運作良好,但我知道,推薦這樣做的方法是通過一個語言環境文件。我遇到麻煩,因爲我驗證另一個模型的屬性,所以下面不工作:

en: 
    activerecord: 
    errors: 
     models: 
     bar: 
      attributes: 
      foo: 
       mode_mismatch: "Foo %{link} has the wrong mode." 

什麼是做到這一點的正確方法是什麼?

+0

問題你正在使用'mode_matcher'方法來驗證,但你沒有在你的yml文件中指定 – Choco 2014-11-21 09:20:53

+0

whoops,如果我使用'mode_matcher'代替'mode_mismatch',則會發生同樣的事情。 – stephenmurdoch 2014-11-21 09:25:22

+0

你會得到錯誤 – Choco 2014-11-21 09:27:15

回答

3

ActiveModel在多個範圍內查找驗證錯誤。 FooBar可以共享同一個錯誤消息mode_mismatch如果包括它在activerecord.errors.messages而不是activerecord.errors.models

en: 
    activerecord: 
    errors: 
     messages: 
     mode_mismatch: "Foo %{link} has the wrong mode." 

使用語言環境字符串與link插值則成爲

def mode_matcher 
    self.foos.each do |foo| 
    next unless foo.mode == "http" 

    errors.add :base, :mode_mismatch, link: Rails.application.routes.url_helpers.foo_path(f) 
    end 
end 
+0

謝謝!我明白現在它是如何工作的。真棒。 – stephenmurdoch 2014-11-21 09:49:02