在我们的应用程序中,除其他外,我们有三个模型:
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才能显示我的数据:(输入字段意味着隐藏)
不确定如何继续。
答案 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为空或将值存储在数据库中,则这些字段将为空。