我希望在验证消息中看不到有效值。
validates_uniqueness_of :event, :scope => :user_id
结果:“已经采取了标题” 我想要: “事件#{事件}已由#{user}”
执行我正在尝试这样做,发髻不工作:
validates_uniqueness_of :event, :scope => :user_id, :message=>"#{self.event} already has been taken by #{self.user}"
答案 0 :(得分:13)
来自ActiveRecord源代码评论:
值:model,:attribute和 :值始终可用 插值值:count是 适用时可用。可以用 为了多元化。
所以你可以简单地将你的信息写成
validates_uniqueness_of :event, :scope => :user_id,
:message=>"{{value}} is already taken"
答案 1 :(得分:6)
嗯,实际上在Rails 3.x中它既不是%{{value}}也不是{{value}},而是%{value}。
答案 2 :(得分:6)
使用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
您似乎试图在名为.errors
的符号上调用:activerecord
方法。)
第二个参数包含一个哈希,其中的字段可以帮助您“提升”您的错误响应。如果我尝试添加带有标点符号的用户名,例如“Superstar !!!”,它将看起来像这样:
{
:model=>"User",
:attribute=>"Username",
:value=>"Superstar!!!"
}
答案 3 :(得分:5)
使用lambda:
validates_uniqueness_of :event, :scope => :user_id, :message=> lambda { |e| "#{e.event} already has been taken by #{e.user}"}