Ruby on rails 如何在单独的类中移动验证方法?
模型有以下代码:Ruby on rails 如何在单独的类中移动验证方法?,ruby-on-rails,Ruby On Rails,模型有以下代码: class Place < ActiveRecord::Base attr_accessible :address, :name, :latitude, :longitude validates :name, :address, :latitude, :longitude, presence: true etc... end 我是否可以将验证方法移到单独的类中,以便在两个类中都使用它?提前感谢。以下是如何做你想做的事。警告其他读者:这样做只是自找麻烦。它非
class Place < ActiveRecord::Base
attr_accessible :address, :name, :latitude, :longitude
validates :name, :address, :latitude, :longitude, presence: true
etc...
end
我是否可以将验证方法移到单独的类中,以便在两个类中都使用它?提前感谢。以下是如何做你想做的事。警告其他读者:这样做只是自找麻烦。它非常脆弱,我想不出为什么您会故意在代码中添加如此脆弱的内容,特别是当一个强大的替代方案随时可用时。如果你不在乎这个警告,请继续阅读 要在Rails3中实现这一点,只需创建一个新模块来存储公共验证器,然后使用include回调在包含该模块的任何类上使用验证器 首先,如果尚未创建模块目录,请创建一个模块目录。我更喜欢
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
最后,您只需在模型中包含此模块。像这样:
class Place < ActiveRecord::Base
attr_accessible :address, :name, :latitude, :longitude
include CommonValidator # <- Add this
etc...
end
classplace
更新您的代码,如:
class Place < ActiveRecord::Base
include CustomPlaceClubValidation
attr_accessible :address, :name, :latitude, :longitude
validates :name, :address, :latitude, :longitude, presence: true
etc...
end
你可以做你想做的事,但这是一个非常糟糕的设计。如果您使用的是Rails4,那么请考虑使用关注点。我使用的是Rails3.2。关注点在此版本中不可用,不是吗?不,它们不可用,但您可以使用模块执行基本相同的操作。我会在一秒钟后公布答案,但我强烈建议不要这样做。说真的,不要这样做。但你可能会发布你关于模块的想法吗?所以,如果你强烈不建议使用此代码,我也不能使用关注点-我应该怎么做?你应该在这两个地方使用相同的验证器。即使你有顾虑,我也不会推荐。上述代码不好的原因是无法保证Place
和PlaceClub
始终相同。事实上,它们很可能在某一点上出现分歧。因此,通过合并验证器,您只会给自己带来很多麻烦。
class Place < ActiveRecord::Base
attr_accessible :address, :name, :latitude, :longitude
include CommonValidator # <- Add this
etc...
end
class Place < ActiveRecord::Base
include CustomPlaceClubValidation
attr_accessible :address, :name, :latitude, :longitude
validates :name, :address, :latitude, :longitude, presence: true
etc...
end
module CustomPlaceClubValidation
extend ActiveSupport::Concern
include Virtus
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
included do
attr_reader :club
attr_reader :place
attribute :name, String
attribute :address, String
attribute :latitude, Float
attribute :longitude, Float
validates :name, :address, :latitude, :longitude, presence: true
etc ...
end
end