Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在单独的类中移动验证方法?_Ruby On Rails - Fatal编程技术网

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