Обратный вызов модели Rails: передача поля в качестве параметра классам обратного вызова? - PullRequest
1 голос
/ 30 марта 2011

Я хочу реализовать обратный вызов 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 Ответ

4 голосов
/ 30 марта 2011

Вы можете сделать это или использовать 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
...