Rails:model.validate-错误的参数数量

时间:2018-07-14 23:05:32

标签: ruby-on-rails ruby ruby-on-rails-5

我是红宝石的新手,我正在尝试为模型的验证失败方案创建自定义消息。这是代码。

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(' ') 

2 个答案:

答案 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,它将接受两个参数。