在Rails中呈现嵌套的表单字段

时间:2014-11-11 11:04:18

标签: ruby-on-rails relationship simple-form nested-forms has-many-through

在我们的应用程序中,除其他外,我们有三个模型:

class PackContent < ActiveRecord::Base
  belongs_to :product
  belongs_to :pack

class Product < ActiveRecord::Base
  has_many :pack_contents
  has_many :packs, through: :pack_contents

class Pack < ActiveRecord::Base
  has_many :pack_contents
  has_many :products, through: :pack_contents
  accepts_nested_attributes_for :pack_contents

一个包有多个pack_contents,它们基本上是一个产品和一些特定的产品变量。连接表(pack_contents)如下所示:

pack_contents

我现在正试图以一种可用的方式显示这些pack_contents,但一直在碰壁。

我试过了:

.pack-product-rows
  - @pack.pack_contents.each do |pc|
    = f.simple_fields_for pc do |p|
      = render :partial => 'pack_product_row', :locals => { :p => p, :pc => pc }

但是,在保存后,我收到一条错误说:

ActiveRecord::UnknownAttributeError in Admin::PacksController#update
unknown attribute: pack_content

表单字段名称属性错误,它们不考虑多个内容,因为它们不包含索引。

当我尝试这个时:

.pack-product-rows
  - @pack.pack_contents.each do |pc|
    = f.simple_fields_for :pack_contents do |p|
      = render :partial => 'pack_product_row', :locals => { :p => p, :pc => pc }

它渲染每个部分两次,我想,这是预期的。

如果我没有遍历内容并只使用simple_fields_for,我会得到我想要的输出,但不是我想要的输出。我可以用p.input_field :id和类似的东西渲染字段,但我需要访问pack_contents才能显示我的数据:(输入字段意味着隐藏)

enter image description here

不确定如何继续。

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解了您的问题,但如果您只想通过simple_fields_for自动访问当前项目,那么您可以访问它通过表单构建器p.object

答案 1 :(得分:1)

我假设您正在尝试在views/packs/show.html.erb上构建嵌套表单,其中您将@pack实例变量从数据库初始化为pack。因此,在此页面上,您将有一个- simple_form_for @pack表单,您希望在其中嵌套pack_contents。 现在simple_form_fields gem的simple_form方法就像rails中的fields_for方法一样。基于此我给你下面的代码。它应该可以正常工作,但您可能会进行一些语法更改以使其正常工作。

- simple_form_for @pack do |pack_form|
  .pack-product-rows
    - @pack.pack_contents.each do |pack_content|
      = f.simple_fields_for :pack_contents, pack_content do |pack_content_fields|
        = render :partial => 'pack_product_row', :locals => { :pack => @pack, :pack_content => pack_content, :pack_content_fields => pack_content_fields}

现在在部分pack_product_row中,您需要使用传递的三个本地人。您必须已经在使用pack和pack_content,但是要显示的pack_contents的任何字段都应写为pack_content_fields.field_name。如果您的命名约定对于所有字段都是正确的,那么如果pack_content为空或将值存储在数据库中,则这些字段将为空。