Вот как сделать то, что вы хотите. Чтобы предупредить других читателей: делать это просто просить о неприятностях. Это очень хрупко, и я не могу придумать, почему вы сознательно добавляете что-то настолько хрупкое в свой код, особенно когда сильная альтернатива легко доступна. Если вы не заботитесь об этом предупреждении, читайте дальше.
Чтобы реализовать это в Rails 3, вы просто создаете новый модуль для хранения своего общего валидатора, а затем используйте входящий вызов, чтобы использовать валидатор для любого класса, который включает в себя модуль.
Сначала создайте каталог модулей, если вы еще этого не сделали. Я предпочитаю lib/modules
. Затем добавьте каталог модулей в путь загрузки путем редактирования config/application.rb
# config/application.rb
require File.expand_path('../boot', __FILE__)
# Pick the frameworks you want:
# ...
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(:default, Rails.env)
module AppName
class Application < Rails::Application
config.autoload_paths += %W(#{config.root}/lib) # <- Add this line
# ...
end
end
Далее создайте модуль. В этом примере я назову его файл common_validator.rb
. Не забудьте разместить его в lib/modules
.
# lib/modules/common_validator.rb
module CommonValidator
def CommonValidator.included(mod)
mod.validates :name, :what, :ever, :params
end
end
Наконец, вы просто включаете этот модуль в свои модели. Например:
class Place < ActiveRecord::Base
attr_accessible :address, :name, :latitude, :longitude
include CommonValidator # <- Add this
etc...
end
У вас есть это. Просто убедитесь, что перезагрузите сервер Rails, чтобы получить изменения пути загрузки. Вы также должны перезапустить сервер, когда вы вносите изменения в модуль. (Изменить: прочитайте this question, чтобы узнать, как перезагрузить модуль по каждому запросу). Rails 4 имеет более хороший синтаксис для этого типа вещей в ActiveSupport::Concern
. Если вы понимаете приведенный выше пример, перенос его в проблему является тривиальным.
можно сделать что вы хотите, но это очень плохой дизайн. Если вы используете Rails 4, изучите проблемы. – Max
Я использую Rails 3.2. Озабоченность в этой версии недоступна, не так ли? – malcoauri
Нет, они не такие, но вы можете сделать практически то же самое, используя модуль. Я отправлю ответ через секунду, но я настоятельно рекомендую не делать этого. Серьезно, не делай этого. – Max