2014-06-06 50 views
2
# model.rb 
validates :employee_id, presence: true, uniqueness: true 

當我留空時,當我想讓員工ID說「員工ID不能爲空」時,錯誤消息顯示「員工不能爲空」。Rails 4驗證消息:從消息中刪除「_id」

# model.rb 
validates :employee_id, presence: { message: " ID can't be blank" }, uniqueness: true 

,其輸出 「僱員ID可以」爲空」:

我通過解決了這個。

但是,這不是一個很好的解決方案國際海事組織。我想要一些自定義整個消息的方法,包括屬性前綴。

有沒有簡單的方法來做到這一點?

+0

我們需要看看您是如何渲染錯誤消息來提供任何類型的解決方案。模型級別的錯誤消息只是'employee_id:[「不能爲空」]。無論呈現您的錯誤消息是負責人性化屬性名稱。 – meagar

回答

3

有幾種「正確」的方法可以解決這個問題,但是你絕對不應該通過驗證本身來做,或者通過定義你自己的驗證方法。

在逐個模型層面上,這由類級別human_attribute_name方法控制。

如果你希望你的模型employee_id場是其中_id後綴不會被截斷特殊的情況下,通過overridding human_attribute_name定義特例:

class MyModel 

    validates :employee_id, presence: true 

    def self.human_attribute_name(attr, options = {}) 
    attr == :employee_id ? 'Employee ID' : super 
    end 
end 

在更廣泛的方面,你可以在ActiveRecord::Base重新定義human_attribute_name覆蓋處理所有_id屬性,但我懷疑你想這樣做。通常,Rails會丟棄_id後綴是一件好事。

第二個(也許更好)的機制是簡單地依靠本地化。 ActiveRecord綁定到您的語言環境YAML文件just about everything。如果你想讓你的employee_id字段人性化到Employee ID而不考慮語言,你需要編輯你的YAML文件。

# config/locales/en.yml 

en: 
    activerecord: 
    attributes: 
     employee_id: "Employee ID" 
+0

你是對的我不想刪除所有屬性的_id,只是這個。通常 _id是一個外鍵,刪除_id是有益的。但是,在這種情況下,employee_id實際上是「真實」屬性名稱而不是外鍵。這與first_name如何映射到「名字」類似。目前,我可能會堅持使用第一種解決方案,因爲我只需要在1個用例(字段旁邊的模型錯誤信息)中進行控制。 –

-1

您可以編寫自定義驗證。通過這樣做,您可以在驗證方法中定義錯誤消息。

從導軌指南的有關部分是在這裏:Performing Custom Validations

是這樣的:

Class Paystub 

    validate :employee_id_is_not_blank 

    def employee_id_is_not_blank 
    errors[:base] << "Employee must be a part of the record.") if id.blank? 
    end 
end 

p = Paystub.create 
p.errors.full_messages #=> ["Employee must be a part of the record."] 

在滑軌指南第7.4節使用錯誤指定[:基]。錯誤消息存入:base不需要將屬性綁定到它們。

更新:這不是正確的答案。請參閱上面的@meagars答案。

+0

這實際上並沒有解決問題。代碼輸出「員工僱員必須是記錄的一部分」。 Rails自動將錯誤消息加上屬性名稱作爲前綴,默認情況下,Rails也將屬性人性化,並在最後刪除「_id」。這可能是正確的方向,但不會按原樣工作。 –

+0

我想我明白了。第7.4節。使用錯誤[:base]。 – gregb

+0

@丹L那工作? – gregb