2010-11-12 114 views
8

我想看到的驗證信息無效值。Rails的覆蓋驗證消息

validates_uniqueness_of :event, :scope => :user_id 

結果:「標題已被採取」 我想: 「事件#{}事件已經已經採取#{}用戶」

我試圖做到這一點的方式,包子不工作:

validates_uniqueness_of :event, :scope => :user_id, :message=>"#{self.event} already has been taken by #{self.user}" 
+0

我假設'事件'是另一個activemodel類? – 2010-11-12 19:02:53

+0

舉個例子。不是真正的項目 – murato 2010-11-12 21:38:14

回答

11

從ActiveRecord的源代碼註釋:

值:模型:屬性和 :值隨時爲您提供 插補值:計數 可用時適用。可以使用 進行多元化。

因此,你可以簡單地寫你的消息

validates_uniqueness_of :event, :scope => :user_id, 
         :message=>"{{value}} is already taken" 
+1

感謝一個錯誤」。它的工作原理,但需要寫{{值}} – murato 2010-11-12 19:03:37

+0

謝謝你,但有沒有辦法讓'%{模型}'輸出一個空格隔開的型號名稱,而不是隻用它的第一個字母的型號名稱大寫?即。 RocketScience以Rocketscience打印出來,但是在插值中使用'%{model}'時,我會對火箭科學或火箭科學感到滿意。 – mkelley33 2012-08-30 15:25:47

5

使用lambda:

validates_uniqueness_of :event, :scope => :user_id, :message=> lambda { |e| "#{e.event} already has been taken by #{e.user}"} 
+0

這就提出了Rails4 – 2015-12-22 11:08:50

5

嗯,其實在Rails的3.X它既不%{{值}}也不{{值}},但%{}值。

6

使用lambda,但至少在最近版本的Rails,ActiveRecord的將嘗試在兩個參數到拉姆達傳遞,它需要考慮這些。用一個簡單的例子,假設我們希望確保用戶名只包含字母數字字符:

validates_format_of :username, :with => /^[a-z0-9]+$/i, 
    :message => lambda{|x,y| "must be alphanumeric, but was #{y[:value]}"} 

傳遞給拉姆達的第一個參數是一個奇怪的不那麼小符號,它會告訴機器人是很好的事錯在哪裏:

:"activerecord.errors.models.user.attributes.username.invalid" 

(如果你通過上面的符號混淆,符號可以包含的不僅僅是字母,數字更多,並強調但是,如果他們這樣做,你必須把引號周圍,否則。 :activerecord.errors貌似你試圖調用一個符號調用.errors方法編號爲:activerecord。)

第二個參數包含一個散列,其中的字段可幫助您「糾正」錯誤響應。如果我嘗試添加一個像「Superstar !!!」標點符號的用戶名,它會看起來像這樣:

{ 
    :model=>"User", 
    :attribute=>"Username", 
    :value=>"Superstar!!!" 
}