我是红宝石的新手,我正在尝试为模型的验证失败方案创建自定义消息。这是代码。
class TestModel
include ActiveModel::Model
attr_accessor :attr
validates :attr, presence: true,
format: {with: /\A[A-Za-z].+\z/,
message: -> (value) do
# Do something with value
end
}
end
model = TestModel.new
model.attr = 23242
model.validate
但是我收到错误消息
ArgumentError: wrong number of arguments (given 2, expected 1)
我在ruby on rails guide 上遵循了类似的示例:第3.3节。像我这样定义消息有问题。
我正在使用滑轨5。 另外,我想用值做的是取反REGEX。
"contains invalid char(s) " +
value.split('').reject{
|e| /\A[A-Za-z].+\z/ =~ e }.join(' ')
答案 0 :(得分:2)
如果您要使用带有:message
选项的lambda,则您的lambda将获得两个参数。来自fine guide:
3.3:消息
[...]
一个Proc:message值具有两个参数:正在验证的对象,以及具有:model
,:attribute
和:value
键值对的哈希。
所以你会说:
message: -> (model, data) do
# Do something with model and data here...
end
并且来自section 2.5:
2.5格式
[...]
另外,您可以使用:without
选项要求指定的属性与正则表达式不匹配。
如果要使用:with
的反义词,请改用:without
。
答案 1 :(得分:0)
您没有正确使用message
。您不需要将其传递给块来插值。像这样使用它。
require 'active_model'
class TestModel
include ActiveModel::Model
attr_accessor :attr
validates :attr,
presence: true,
format: {with: /\A[A-Za-z].+\z/,
message: "#{value} is wrong" }
end
model = TestModel.new
model.attr = 23242
puts model.validate # false
puts model.errors.full_messages # Attr 23242 is wrong
是的,它是%{value}
而不是#{value}
如果您确实想使用proc,它将接受两个参数。