Ruby on rails 如何在validates_length_为的模型中使用相同的标记器?

Ruby on rails 如何在validates_length_为的模型中使用相同的标记器?,ruby-on-rails,dry,Ruby On Rails,Dry,我在模型中进行了以下验证: validates_length_of :description, :minimum => 2, :on => :save, :message => "must be at least 2 words", :tokenizer => lambda {|text| text.scan(/\w+/)} 这个很好用。当我向模型中添加第二个需要通过字数验证的字段时,我声明 tokenize_by_words = lambda {|text

我在模型中进行了以下验证:

validates_length_of :description,
  :minimum => 2, :on => :save,
  :message => "must be at least 2 words",
  :tokenizer => lambda {|text| text.scan(/\w+/)}
这个很好用。当我向模型中添加第二个需要通过字数验证的字段时,我声明

tokenize_by_words = lambda {|text| text.scan(/\w+/)}
在模型的顶部,并使用

:tokenizer => tokenize_by_words
这也可以很好地工作,并保持一切干燥。然而,当我需要在多个模型中使用相同的标记器时,这一切都会崩溃。如果我创建config/initializers/tokenizers.rb,那么:

class ActiveRecord::Base
  tokenize_by_words = lambda {|text| text.scan(/\w+/)}
end
并删除模型中的定义,我得到
/Library/Ruby/Gems/1.8/Gems/activerecord-2.3.5/lib/active_record/base.rb:1959:in'method_missing':未定义的局部变量或方法'tokenize_by_words'for#(NameError)

使用实例变量或用方法替换整个过程也不起作用


<>我确信我缺少了一些明显的东西,但是我能找到的唯一的文件:ToKeNeisher并不真正考虑干燥度:(

)你应该把标记器定义为一种方法,即

class ActiveRecord::Base
  def foo(text)
    text.scan(/\w+/)
  end
end
现在,使用此方法符号作为
:标记器
属性的值

validates_length_of :description,
  :minimum => 2, :on => :save,
  :message => "must be at least 2 words",
  :tokenizer => :foo

您将能够使用:符号作为标记器。
请继续收看;)

类文章
包括ActiveModel::Model
验证内容的长度,
:最小=>10,
:message=>“必须至少包含10个单词”,
:tokenizer=>:通过单词标记化
def通过单词(文本)标记化
text.scan(/\w+/)
结束
结束

我的红宝石有点生锈了,但是基于错误消息:如果你把
类放进去会怎么样谢谢-不幸的是,我现在在运行模型的specfile时得到了这个消息:“GbgSymbols中应该有至少2个单词”未定义方法“call”的描述:tokenize_by_words:Symbol,这与我根本没有定义标记器一样!config/initializers目录是定义的正确位置,不是吗?它应该可以工作。我已经证实了这一点。您是否可以尝试将该方法放在其中一个模型(而不是ActiveRecord::Base)中,看看它是否有效。如果是这样,那么将此方法添加到ActiveRecord::基类的方式可能存在问题。阅读此线程以获取有关扩展ActiveRecord的信息:返回此线程需要一些时间!我已经将您的答案标记为已接受,但仍然会得到相同的错误,即使将该方法直接放入模型中。你链接到的线程没有帮助,因为它只是表明我已经做了正确的事情。(因为Rails都是关于约定而不是配置的,所以您可能会认为某个地方会有tokenizers.rb,不是吗?:)我也遇到了同样的错误。似乎@HarishShetty有他自己版本的活动记录:)