0

在狂欢中,我为 :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。

4

1 回答 1

1

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

  1. 在产品内的关联模型变体上添加验证
  2. 将任何错误从 variant.errors 复制到 product.errors
  3. 向变体模型添加验证(与以前相同)

这两个更改都是在 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 我写了一个回调来复制错误 after_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

注意:即使 Product 控制器默认没有编辑操作的代码,也会呈现相应的 #{action}.html 文件。我能够在其中找到它.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? %>
于 2013-05-29T20:37:24.950 回答