在模型中导入 rails_admin 时跳过验证
Skip validations in importing rails_admin in model
如果我在 rails_admin_import 中导入模型中的字段,如何跳过验证?喜欢:
Class Dog < ActiveRecord::Base
has_many :dog_quantity
has_many :dog_price
validates_presence_of :dog_quantity, :dog_price, :on => :import
end
有办法吗?谢谢!
也许尝试在 RailsAdmin mailing list 上提问。
您可能还想阅读“Get Rid of Your Admin Gem”。
而且,您是否仔细研究了 conditional validation 上的 Active Record 验证指南部分?
首先,一个警告。我不使用 rails_admin 或 rails_admin_import gem。但是,根据 https://github.com/stephskardal/rails_admin_import#import-hooks 上的文档,您可以:
Define instance methods on your models to be hooked into the import
process, if special/additional processing is required on the data:
像这样:
class User < ActiveRecord::Base
def before_import_save(record)
# Your custom special sauce
end
def after_import_save(record)
# Your custom special sauce
end
end
知道这一点后,您可以在 #before_import_save
挂钩内的 model/record 上设置一个名为 is_importing
之类的临时标志,并根据其值有条件地进行验证。例如:
Class Dog < ActiveRecord::Base
has_many :dog_quantity
has_many :dog_price
validates :dog_quantity, presence: true, unless: :is_importing
validates :dog_price, presence: true, unless: :is_importing
attr_accessor :is_importing
def before_import_save(record)
record.is_importing = true
end
end
这里有几点需要注意。首先,我将验证分成两个语句。其次,我正在使用我认为在 Rails 4 中可用的较新样式的验证语法。通常,这种样式是首选。如果您使用的是 Rails 版本 < 4,则返回使用 validates_presence_of
,它应该仍然有效。第三,如果 before_import_save
从未被调用,is_importing
将为 nil,并且由于评估为假,验证将在应用程序的正常操作期间按预期触发(即:不导入)。
就像我说的,我没有测试任何这些,我或多或少有点想不通,所以可能会有错误。尽管如此,我的感觉是利用导入挂钩来解决问题是您想要的。
所以我的解决方案是分叉 rails_admin_import 并在 importer.rb
文件中我更改了
if object.save
进入
if object.save(:validate => false)
如果我在 rails_admin_import 中导入模型中的字段,如何跳过验证?喜欢:
Class Dog < ActiveRecord::Base
has_many :dog_quantity
has_many :dog_price
validates_presence_of :dog_quantity, :dog_price, :on => :import
end
有办法吗?谢谢!
也许尝试在 RailsAdmin mailing list 上提问。
您可能还想阅读“Get Rid of Your Admin Gem”。
而且,您是否仔细研究了 conditional validation 上的 Active Record 验证指南部分?
首先,一个警告。我不使用 rails_admin 或 rails_admin_import gem。但是,根据 https://github.com/stephskardal/rails_admin_import#import-hooks 上的文档,您可以:
Define instance methods on your models to be hooked into the import process, if special/additional processing is required on the data:
像这样:
class User < ActiveRecord::Base
def before_import_save(record)
# Your custom special sauce
end
def after_import_save(record)
# Your custom special sauce
end
end
知道这一点后,您可以在 #before_import_save
挂钩内的 model/record 上设置一个名为 is_importing
之类的临时标志,并根据其值有条件地进行验证。例如:
Class Dog < ActiveRecord::Base
has_many :dog_quantity
has_many :dog_price
validates :dog_quantity, presence: true, unless: :is_importing
validates :dog_price, presence: true, unless: :is_importing
attr_accessor :is_importing
def before_import_save(record)
record.is_importing = true
end
end
这里有几点需要注意。首先,我将验证分成两个语句。其次,我正在使用我认为在 Rails 4 中可用的较新样式的验证语法。通常,这种样式是首选。如果您使用的是 Rails 版本 < 4,则返回使用 validates_presence_of
,它应该仍然有效。第三,如果 before_import_save
从未被调用,is_importing
将为 nil,并且由于评估为假,验证将在应用程序的正常操作期间按预期触发(即:不导入)。
就像我说的,我没有测试任何这些,我或多或少有点想不通,所以可能会有错误。尽管如此,我的感觉是利用导入挂钩来解决问题是您想要的。
所以我的解决方案是分叉 rails_admin_import 并在 importer.rb
文件中我更改了
if object.save
进入
if object.save(:validate => false)