Ruby on rails Rails覆盖验证消息
我想在验证消息中看到无效值Ruby on rails Rails覆盖验证消息,ruby-on-rails,Ruby On Rails,我想在验证消息中看到无效值 validates_uniqueness_of :event, :scope => :user_id 结果:“标题已被取下” 我想: “事件#{Event}已由#{user}获取” 我试着这样做,bun不工作: validates_uniqueness_of :event, :scope => :user_id, :message=>"#{self.event} already has been taken by #{self.user}" 使用
validates_uniqueness_of :event, :scope => :user_id
结果:“标题已被取下”
我想:
“事件#{Event}已由#{user}获取”
我试着这样做,bun不工作:
validates_uniqueness_of :event, :scope => :user_id, :message=>"#{self.event} already has been taken by #{self.user}"
使用lambda:
validates_uniqueness_of :event, :scope => :user_id, :message=> lambda { |e| "#{e.event} already has been taken by #{e.user}"}
从ActiveRecord源代码注释: 值:model、:attribute和 :值始终可用于 插值值:count为 适用时可用。可以使用 为了多元化 所以你可以简单地把你的信息写成
validates_uniqueness_of :event, :scope => :user_id,
:message=>"{{value}} is already taken"
实际上,在Rails 3.x中,它既不是%{value}也不是{{value}},而是%{value}。使用lambda,但至少在Rails的较新版本中,ActiveRecord将尝试向该lambda传递两个参数,并且需要考虑它们。举一个简单的例子,假设我们希望确保用户名只包含字母数字字符:
validates_format_of :username, :with => /^[a-z0-9]+$/i,
:message => lambda{|x,y| "must be alphanumeric, but was #{y[:value]}"}
传递给lambda的第一个参数是一个奇怪而不太小的符号,它非常适合告诉机器人出了什么问题:
:"activerecord.errors.models.user.attributes.username.invalid"
(如果您对上面的符号感到困惑,符号可能不仅仅包含字母、数字和下划线。但是如果它们包含,您必须在它们周围加引号,否则:activerecord.errors
看起来就像您试图调用名为:activerecord
的符号上的.errors
方法)
第二个参数包含一个散列,其中的字段将帮助您“整理”错误响应。如果我尝试添加一个带有标点符号的用户名,如“Superstar!!!”,它将如下所示:
{
:model=>"User",
:attribute=>"Username",
:value=>"Superstar!!!"
}
我假设“event”是另一个activemodel类?举个例子。不是在真实的项目中谢谢,但是有没有办法让
%{model}
输出一个空格分隔的模型名,而不是第一个字母大写的模型名?例如,RocketScience打印为RocketScience,但在我的插值中使用%{model}
时,我会对Rocket Science或Rocket Science感到满意。@mkelley33使用此答案将消息指向lambda,然后您可以插值self
,这将返回对模型的引用。