2010-11-12 93 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!!!" 
}