在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。
答案 0 :(得分:1)
我意识到:sku属于主模型,而大多数其他params属于产品模型。 products /:product_id / edit实际上只显示了产品模型的验证信息,所以我必须做的是
这些更改都是在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
注意:即使产品控制器没有呈现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? %>