Rails模型回调:将字段作为参数传递给回调类?

时间:2011-03-29 21:00:43

标签: ruby ruby-on-rails-3 callback parameter-passing

我想在一个单独的类中实现before_validaton回调,以便多个模型类可以重用它。

这里在回调中我想剥离作为参数传递的字段,但我不知道如何将参数传递给回调类。此外,我想传递此作为参考而不是值(不确定这个概念是否在Ruby Rails中)。我正在关注链接http://guides.rubyonrails.org/active_record_validations_callbacks.html#callback-classes

这里的代码不完全正确,请帮助相同

class StripFieldsCallback
    def self.before_validation(field)
        field = field.strip
    end
end

class User < ActiveRecord::Base
    validates_uniqueness_of :name, :case_sensitive => false
    validates_length_of :name, :maximum => 50
    before__validation   StripFieldsCallback(name)
end

如果我在模型中定义方法本身而不是在单独的回调中定义类代码就像这样(工作正常)

    class User < ActiveRecord::Base
           validates_uniqueness_of :name, :case_sensitive => false
           validates_length_of :name, :maximum => 50
           before__validation  :strip_blanks

           protected
           def strip_blanks
                 self.name = self.name.strip
           end
    end

当然,在所有模型中复制方法并不好,所以我想在回调类中定义方法。

1 个答案:

答案 0 :(得分:4)

您可以这样做或使用normalize_attributes gem

module StripFieldsCallback
  def before_validation_z(field)
    write_attribute(field, read_attribute(field).strip) if read_attribute(field)
  end
end

class User < ActiveRecord::Base
  include StripFieldsCallback

  before_validation   lambda{|data| data.before_validation_z(:name)}
end