我只是问自己,对我的问题最好的解决办法。
以下是我的模特:
class Product < ActiveRecord::Base
has_many :prices, :class_name => "ProductPrice"
accepts_nested_attributes_for :prices
end
class ProductPrice < ActiveRecord::Base
belongs_to :product
end
控制器
def create
@product = Product.new(params[:product])
@product.save
...
end
我想要做的是阻止在product_price.value == nil
或product_price.value == 0.0
before_save
挂钩。 return false
会回滚整个交易,这不是我想做的事情。我只想用value == 0 or value == nil
params[...]
踢出所有price_params,而不是打电话Product.new(params[:product])
似乎不是铁路方式...... Product.new(params[:product])
之后迭代所有价格并从数组中删除它们。但逻辑应该在我的模型中吗?我只是不想在每个创造新价格的控制器上重复自己...... 有人可以告诉我最佳解决方案吗?什么是轨道?
谢谢!
答案 0 :(得分:0)
你想要它被称为验证钩子,如下所示:
class ProductPrice < ActiveRecord::Base
belongs_to :product
validates :value, :numericality => {:greater_than => 0.0 }
end
有关您可能希望通过更精细控制执行此操作的其他方式,请参阅http://guides.rubyonrails.org/active_record_validations_callbacks.html。
为了避免首先添加这些无效价格,您可以将其从嵌套属性哈希中删除,如下所示:
class Product < ActiveRecord::Base
def self.clean_attributes!(product_params)
product_prices = product_params['prices'] || []
product_prices.reject!{|price| price['value'].to_f == 0 rescue true }
end
end
Product.clean_attributes!(params[:product])
Product.new(params[:product])