我有一个嵌套的表单:
<%= form_for shop_product do |f| %>
...
<%= f.fields_for :shop_product_print_files do |ff| %>
<%= ff.object.print_location.title %>
<%= ff.hidden_field :print_location_id %>
<%= ff.select :image_file_id, options_for_select(@image_files.map { |image| [image.id, {'data-img-src'=>image.image_file_url(:thumb)}]}), {:include_blank => 'Noneblank'}, class: "image-picker" %>
...
更新时,如果:image_file_id
为空白,则会拒绝并删除:
shop_product模型
accepts_nested_attributes_for :shop_product_print_files, reject_if: :reject_file, :allow_destroy => true
def reject_file(attributes)
if attributes[:image_file_id].blank?
if attributes[:id].present?
attributes.merge!({:_destroy => 1}) && false
else
true
end
end
end
在更新方法中,问题所在:
@shop_product.price = (@shop_product.print_locations.to_a.sum { |sp| sp.price } + @shop_product.product.price)
删除操作是在更新之后进行的,并且似乎是重定向成功更新之前发生的最后一项操作。
更新计算并销毁记录后如何创建该计算?
我尝试过:
after_commit :calculate_price
def calculate_price
self.price = (self.print_locations.to_a.sum { |sp| sp.price } + self.product.price)
end
end
after_updated
after_save
不起作用
同样要澄清的是,此计算适用于create。问题是由于如上所述删除了更新记录,它在更改数据库之前启动,这就是为什么我认为after_commit
可以工作的原因。
尝试使用ShopProductPrintFile模型:
after_commit :calculate_sp, on: [:update, :destroy]
def calculate_sp
shop_product = ShopProduct.find(self.shop_product.id)
price = (shop_product.print_locations.to_a.sum { |sp| sp.price } + shop_product.product)
shop_product.update_attributes!(price: price)
end
end
仍然无法正常工作,但看起来应该这样吗?我的语法写得不正确吗?
解决方案:
after_commit :calculate_sp
def calculate_sp
shop_product = ShopProduct.find(self.shop_product.id)
price = (shop_product.print_locations.to_a.sum { |sp| sp.price } + shop_product.product.price)
shop_product.price = price
shop_product.save!
end
答案 0 :(得分:0)
尝试在您的after_commit :update_product_price, on: :destroy
模型中使用ShopProductPrintFile
。当shop_product_print_files
被销毁时,您需要重新计算产品价格。
在您的示例中,您需要将save!
添加到after_commit
中,否则它将不会保存到数据库中。但是您应该小心,它将触发对产品模型的另一次更新并再次触发after_commit
。因此您必须添加条件以检测是否应触发after_commit
。
答案 1 :(得分:0)
这可以与放入ShopProductPrintFile模型一起使用。
在更新时,创建并销毁。
after_commit :calculate_sp
def calculate_sp
shop_product = ShopProduct.find(self.shop_product.id)
price = (shop_product.print_locations.to_a.sum { |sp| sp.price } + shop_product.product.price)
shop_product.price = price
shop_product.save!
end
我不会接受此响应,因为我确信这样做有更好的方法或语法。如果您有此问题,请回答并说明为什么它是一种更有效或更有效的方法,我会接受您的