【问题标题】:Rendering nested form fields in Rails在 Rails 中渲染嵌套的表单字段
【发布时间】:2015-01-07 21:53:25
【问题描述】:

在我们的应用中,我们有以下三种模型:

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-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 才能像这样显示我的数据:(要隐藏的输入字段)

不知道如何继续。

【问题讨论】:

  • 在您的class Pack 中输入了has_many :product, through: :pack_contents。应该是has_many :products, through: :pack_contents。是打字错误吗?
  • 是的,错字。我在应用程序中收到了:products。会修复的。

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


【解决方案1】:

我假设您正在尝试在 views/packs/show.html.erb 上构建嵌套表单,其中 @pack 实例变量已从数据库初始化为 pack。因此,在此页面上,您将有一个 - simple_form_for @pack 表单,您希望在其中嵌套 pack_contents。 现在simple_form gem 的simple_form_fields 方法就像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 为空,或者将值存储在数据库中,这些字段将为空。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢。我不知道,这正是我要找的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多