accepted_nested_attributes_for虚拟属性

时间:2011-08-08 12:15:48

标签: ruby-on-rails nested-attributes virtual-attribute

我有2个型号:

class Invoice < ActiveRecord::Base
 has_many :invoice_items
 accepts_nested_attributes_for :invoice_items, :allow_destroy => true

end

class InvoiceItem < ActiveRecord::Base
  attr_accessor :encryption_key                  
  belongs_to :invoice     
end

发票项目的列已加密,我使用来自会话的加密密钥。我不希望这个密钥存储在服务器或任何其他模型中。

来自控制器:

params[:invoice][:invoice_items_attributes].each_value {
   |v| v.merge!(:encryption_key => session['access_key']) 
}           
@invoice = Invoice.new(params[:invoice])

这会将键放入属性列表中,但在创建发票时不会将其传递给InvoiceItems模型...

关于如何使这项工作的任何指示都会很棒。

1 个答案:

答案 0 :(得分:2)

问题在于,由于字段是虚拟属性,因此您需要通过发票项目模型的字段的setter方法,这样您就必须手动编写解决方案代码,而不是依赖嵌套属性。

实现此目标的一种方法是创建一种特定方法来处理发票模型类上的发票项目。您可以将params传递给该方法并处理在该方法中创建/查找发票项目,将params分配给处理invoice_item类上的加密的正确setter方法,然后直接从您的控制器调用该方法。