狂欢自定义错误:如何在相关模型中触发错误

时间:2013-05-29 00:00:36

标签: ruby-on-rails-3 spree

在spree中我为:sku属性添加了唯一性约束

#In spree/models/variant_decorator.rb

Spree::Variant.class_eval do
    validate :sku, :uniqueness => true
 end

Spree::Admin::ProductsController.class_eval do

 # controllers/spree/admin/product_controller_decorator.rb
def update
  if params[:product][:collection_ids].present?
    params[:product][:collection_ids] = params[:product][:collection_ids].split(',')
  end
  if params[:product][:taxon_ids].present?
    params[:product][:taxon_ids] = params[:product][:taxon_ids].split(',')
  end
  @product.errors[:name] = "Trying to trigger an error"
  @product.errors[:base] = "Trying to trigger an error"
  flash[:warning] << "Custom Error"     
  super
  end
end

在/ products /:product_id / edit /上,即使验证了sku的唯一性,验证失败时也不会显示错误。如何触发显示验证错误?我试过修改控制器和模型。提前谢谢。

我正在使用Rails 3.2并运行Spree 2.0。

1 个答案:

答案 0 :(得分:1)

我意识到:sku属于主模型,而大多数其他params属于产品模型。 products /:product_id / edit实际上只显示了产品模型的验证信息,所以我必须做的是

  1. 在产品中的关联模型变体上添加验证
  2. 将variant.errors中的任何错误复制到product.errors
  3. 为变体模型添加验证(与之前相同)
  4. 这些更改都是在app / models / views / product_decorator.rb中进行的 为了向相关模型添加验证,我添加了以下代码,

    #app/models/spree/product_decorator.rb
    validates_associated :variants, :variants_including_master, :master #validation just master should work too
    

    要将master.errors中的错误复制到product.errors,我写了一个回复函数来复制post_validaiton

    #app/models/spree/product_decorator.rb
    after_validation :merge_master_errors
    def merge_master_errors
      self.master.errors.each do |attribute, message|
        self.errors.add(attribute, message)
      end
    end
    

    3:

    #app/models/spree/variant_decorator.rb
    validates :sku, :uniqueness => true
    

    https://github.com/spree/spree/blob/abf38b0fa5a970953c86c73c7f1f2828c43cba3a/core/app/models/spree/product.rb

    注意:即使产品控制器没有呈现default the corresponding #{action}.html file的编辑操作的代码。我能够在.rvm/gems/ruby-1.9.3/bundler/gems/spree-<special-hash-or-version>/backend/app/views/spree/admin/products/edit.html.erb中找到它(这在rails服务器标准输出中可见)并添加了一些“打印语句到html”,例如。

    <%= debug @product %>
    <%= product.errors.to_hash %>
    <%= @product.errors.any? %>