2011-05-20 53 views
23

當用戶嘗試創建一個記錄已存在,我想表明這樣的錯誤消息的名稱:如何定製軌ActiveRecord的驗證錯誤消息顯示屬性值

name "some name" has already been taken

我有一直在努力做:

validates_uniqueness_of :name, :message => "#{name} has already been taken" 

但這輸出表名稱,而不是名稱屬性值的

回答

36

兩件事情:

  1. 驗證消息使用Rails I18n style interpolation,這是%{value}
  2. 關鍵是value,而不是name,因爲在國際化的背景下,你真的不關心模型的其餘部分。

所以,你的代碼應該是:

validates_uniqueness_of :name, :message => '%{value} has already been taken' 
+1

不錯!絕對比我的答案更清潔。 – 2011-05-20 14:42:20

+1

知道%{attribute}也可用是有用的。 – zwalker 2016-01-09 00:42:53

+0

'%{value}'在Rails 4中不起作用。 :( – 2016-03-18 17:27:01

16

它看起來像喲你可以將Proc傳遞給消息。當你這樣做,你會得到兩個參數:

  1. 沿:activerecord.errors.models.user.attributes.name.taken
  2. ,看起來像`{A哈希線符號:模型=> 「用戶」,:屬性=> 「名稱」, :值=>「我的名字」}

所以,如果你允許在一個進程的兩個參數,你可以使用attributes[:value]項目得到了所使用的名稱:

validates_uniqueness_of :name, 
         :message => Proc.new { |error, attributes| 
          "#{attributes[:value]} has already been taken." 
         } 
3

你用什麼版本的Rails的?

如果Rails 3. 那麼據我所知你應該使用:message => '%{value} has already been taken'。我不知道Rails 2.3。 - 但無論如何,您都可以創建自己的自定義驗證來執行您所需的操作。

+0

爲這個應用程序,我使用rails 2.3.4 – umar 2011-05-26 10:42:26

相關問題