Rails 3.如果要保存对象,请确定保存

时间:2012-07-09 19:54:42

标签: ruby-on-rails-3.1 save

我只是问自己,对我的问题最好的解决办法。

以下是我的模特:

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 == nilproduct_price.value == 0.0

时保存所有ProductPrices
    ProductLrice中的
  1. before_save挂钩。 return false 会回滚整个交易,这不是我想做的事情。我只想用value == 0 or value == nil
  2. “踢”所有价格
  3. 首先从params[...]踢出所有price_params,而不是打电话Product.new(params[:product])似乎不是铁路方式......
  4. Product.new(params[:product])之后迭代所有价格并从数组中删除它们。但逻辑应该在我的模型中吗?我只是不想在每个创造新价格的控制器上重复自己......
  5. 有人可以告诉我最佳解决方案吗?什么是轨道?

    谢谢!

1 个答案:

答案 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])