将accepts_nested_attributes_for用于新对象,而不向用户显示所有子记录

时间:2014-11-16 11:32:57

标签: ruby-on-rails nested-attributes

我试图以稍微不规则的方式使用accepts_nested_attributes_for

估计有很多款项:

class Estimate
  has_many   :moneys           , :as => :moneyable, :dependent => :destroy
  accepts_nested_attributes_for :moneys
  ...
end

但是在估算的编辑表单中,我不希望用户看到所有先前资金的嵌套字段集'值。我只想让她看到一组空钱币。来自Rails'从观点来看,估计将具有所有先前货币的良好历史,但是从用户的角度来看,如果她想要改变估计,她将仅看到一些她可以填写的空字段。

= f.semantic_fields_for @estimate.moneys.build do |money|
  = money.input :quantity 
  ...

通常你会f.semantic_fields_for :moneys,但这会显示以前所有的儿童资金记录。我也可以使用javascript动态生成字段,但我想避免这样做,因为它是用户必须点击的另一个按钮。因此,我在表单中构建一个新对象(出于正派的考虑,我最终可能会转移到控制器上)。

麻烦的是,如果我按照上面的形式构建一个新对象,我就不会获得accepts_nested_attributes_for善良,因为Rails不会将这些钱参数传递给:money_attributes。它会将其作为:money传递给他们:

Parameters: {..."estimate"=>{"book_id"=>"1418", ...,  "money"=>{"quantity"=>"321",...}}, "commit"=>"Save", "id"=>"67"}

我可以在控制器中进行操作,添加父的id(和类型,在这种情况下,因为它是一个多态关系),但这很难看。我错过了一种方法,我可以在构建新对象时使用ANAF并且不向用户显示视图中的所有子记录吗?

1 个答案:

答案 0 :(得分:0)

哦,我明白了这个问题。几乎没有可能的解决方案。

  • 一个是您使用原始html属性手动操作表单
  • 您可以检查表单构建器对象的对象是否是新记录?

然后条件可能如下:

= f.semantic_fields_for @estimate.moneys.build do |money|
  - if money.object.new_record?
     = add your form attribute here

因此,这只会让您显示表单,为您的表单创建一个新的嵌套记录。

我希望这个答案至少能给出一个想法。