Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails覆盖验证消息_Ruby On Rails - Fatal编程技术网

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
,这将返回对模型的引用。