如果Product
不属于Store
after_save
,我将如何销毁它?
class Product < ActiveRecord::Base
attr_accessible :price, :name, :product_store
belongs_to :store
attr_reader :product_store
# I need this to do also "p.product_store.blank?"
after_save { |p| p.destroy if p.name.blank? && p.price.blank? }
def product_store=(id) # using Jquery TokenInput so only needed this.
self.store_id = id
end
end
我尝试了几种不同的方法,如:
after_save { |p| p.destroy if p.name.blank? && p.price.blank? && p.product_store.blank? }
after_save { |p| p.destroy if p.name.blank? && p.price.blank? && p.store.id.blank? }
after_save { |p| p.destroy if p.name.blank? && p.price.blank? && p.store_id.blank? }
after_save { |p| p.destroy if p.name.blank? && p.price.blank? && p.store.blank? }
但是这些没有用,所以我请求你帮忙解决它的问题?
这是我的表单和控制器:https://gist.github.com/1472629
答案 0 :(得分:2)
这似乎更像是验证问题。如果没有Store
它无效,那么您根本不应该在没有Store
引用的情况下将其保存到数据库中。
如果你想销毁Product
,你应该直接这样做,而不是保存对商店的零引用,试图抓住它,然后将其销毁。
通过尝试在其关联不正确时销毁记录,您实际上是在说“这处于无效状态,并且不应该首先在数据库中。”
答案 1 :(得分:2)
如何使用ActiveModel :: Validations? 如果某些属性没有填写,你不想保存记录。所以你需要验证。
class Product < ActiveRecord::Base
validates_presence_of :name, :price, :store_id
end
编辑:
您的代码看起来想要使用常用属性创建多个产品。 可能是这样的参数:
{"products" => {:1 => {:name => "good", :desc => "sss"}}, {:2 => {:name => "good", :desc => "tt"}}, "product" => {:price => "10"} }
控制器 def create_multiple @products = params [:products] .values.collect do | up | Product.new(up.merge(PARAMS [:产品])) 结束 if @ products.each(&amp;:save) redirect_to:back,:notice =&gt; “成功!” 其他 渲染:新的 结束 端
验证不需要更改。但形式会有点复杂。
form_tag "/products" do
%p
= text_field_tag "product[price]", @products.first.price
= @products.first.errors[:price]
- @products.each_with_index do |product, idx|
= text_field_tag "products[#{idx}][name]", product.name
= product.errors[:name]
= submit_tag :submit
代码很简单,你可以自己增强视图。