Rails 具有嵌套属性的表单。 text_field 没有出现
Rails form with nested attributes. text_field not appearing
问题:我有一个嵌套的 fields_for text_field 没有出现,我不确定我做错了什么。
目标:在创建记录时,遍历具有预设变量的模型,并将文件(使用 text_field 进行测试)保存到连接 table,从而保存预设变量和表单记录 ID
型号:
class PrintLocation < ApplicationRecord
has_many :shop_products, through: :shop_product_print_files
has_many :shop_product_print_files
accepts_nested_attributes_for :shop_product_print_files
end
class ShopProductPrintFile < ApplicationRecord
belongs_to :shop_products
belongs_to :print_locations
end
class ShopProduct < ApplicationRecord
...
has_many :shop_product_print_files
has_many :print_locations, through: :shop_product_print_files
accepts_nested_attributes_for :print_locations
accepts_nested_attributes_for :shop_product_print_files
...
end
表格:
<%= form_for @shop_product do |f| %>
<%= f.collection_select :product_id, @products, :id, :sku %>
<% PrintLocation.all.each do |print_location| %>
<%= print_location.title %>
<%= f.fields_for :shop_product_print_files do |a| %>
<%= a.text_field :print_file %>
<% end %>
<% end %>
<%= f.submit %>
<% end %>
这样,text_field 不会出现,但 print_location.title
会出现。没有错误。
在保存 @shop_product
时,我希望能够遍历已定义的可能 print_location
变量,然后针对每个可能的 print_location
,然后能够上传文件(text_field 用于测试),然后将其保存到具有 shop_product_id
、print_location_id
和 print_file
属性的 ShopProductPrintFile 模型。
我对如何使用 fields_for
有什么误解吗?
店铺产品负责人:
创建:
@shop_product = ShopProduct.new(shop_product_params)
shop = Shop.find(params["shop_product"]["shop_id"])
product = Product.find(params["shop_product"]["product_id"]) @shop_product.product_id = product.id
@shop_product.shop_id = shop.id
respond_to do |format|
if @shop_product.save!
...
更新:
@shop_product = ShopProduct.find_by(store_variant_id: params["shop_product"]["store_variant_id"])
@product = Product.find(params["shop_product"]["product_id"])
强参数:
def shop_product_params
params.require(:shop_product).permit(:product_id, :store_product_id, :shop_id, :store_variant_id, :sync, :shop_product_print_file_attributes[:id, :print_files, :print_location_ids => [], :shop_product_ids => []], {print_location_ids: []})
end
更新 2:
更新和创建方法:
@shop_product.shop_product_print_files.build
形式:
<% PrintLocation.all.each do |print_location| %>
<%= print_location.title %>
<%= f.fields_for :shop_product_print_files_attributes do |a| %>
<%= a.text_field :print_file %>
<%= a.hidden_field :print_location_id, value: print_location.id %>
<%= a.hidden_field :shop_product_id, value: shop_product.id %>
<% end %>
<% end %>
参数:
def shop_product_params
params.require(:shop_product).permit(:shop_product_print_files_attributes => [:ids => [], :print_files => [], :print_location_ids => [], :shop_product_ids => []])
end
错误:
Shop product print files shop products must exist
Shop product print files print locations must exist
通过的参数:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"u/c103465uNCjF/trYrMleqxJ8b9wyLbU/vjPK4llYtCg/ODj92q5MN24==", "shop_product"=>{"sync"=>"1", "product_id"=>"3", "shop_product_print_files_attributes"=>{"print_file"=>"", "print_location_id"=>"6", "shop_product_id"=>"42"}, "store_product_id"=>"191234345", "store_variant_id"=>"15341234273", "id"=>"42"}, "commit"=>"Sync", "id"=>"42"}
模型没有改变。
参数中的打印文件仍然空白?
更新 3:
**使用这种形式:感谢@arieljuod **
<%= f.fields_for :shop_product_print_files do |ff| %>
<%= ff.object.print_location.title # get the print location from the association %>
<%= ff.hidden_field :print_location_id # save the print_location_id as a hidden field %>
<%= ff.file_field :print_file # file input %>
<% end %>
用这个在新的和方法中容纳视图:
@shop_product = ShopProduct.new
PrintLocation.all.each{|p| @shop_product.shop_product_print_files.build(print_location: p)}
正在创建。
由于 API 导致页面加载之前不知道 ShopProduct 的 ID,问题仍然存在,并且一个页面上可能有多个 ID。
我用:
<% if @shop_products.find_by(store_variant_id: variant.id) %>
<% shop_product = @shop_products.find_by(store_variant_id: variant.id) %>
<%= form_for shop_product do |f| %>
...
其中,variant
来自由 API:
定义的循环
<% @in_store_variants.each do |variant| %>
现在当使用shop_products
时(当variant.id
发现shop_product已经存在时),fields_for不会出现。假设这是因为没有相关记录存在。只有 shop_product.shop_product_print_files 存在才会出现。
据我所知,目前唯一的解决方法是保存所有 print_locations,但使用实际激活的布尔值,或搜索 print_locations 附加了 ID。但我宁愿不那样做,只保存在创建时选择的 print_locations(通过上传 print_file
选择)。
对于"fix"这个问题,本人:
添加了 accepts_nested_attributes_for reject_if: proc { |attributes| attributes['print_file'].blank? }
,它不会保存 ShopProductPrintFile,除非 print_file 字段提交了一些东西...
使用此表格(2 个表格取决于是否存在)
<% if @shop_products.find_by(store_variant_id: variant.id) %>
<%= form_for shop_product do |f| %>
<% PrintLocation.all.each{|p| shop_product.shop_product_print_files.build(print_location: p)} %>
<%= f.fields_for :shop_product_print_files do |ff| %>
<%= ff.object.print_location.title %>
<%= ff.hidden_field :print_location_id %>
<%= ff.text_field :print_file %>
<% end %>
<%= f.submit "Sync" %>
<% end %>
<% else %>
<%= form_for @shop_product do |f| %>
<% PrintLocation.all.each{|p| @shop_product.shop_product_print_files.build(print_location: p)} %>
<%= f.fields_for :shop_product_print_files do |ff| %>
<%= ff.object.print_location.title %>
<%= ff.hidden_field :print_location_id %>
<%= ff.text_field :print_file %>
<% end %>
...
2 的问题是我关联了 PrintLocation 1、2、3,它将显示 9 个字段,1、2、3 准备好更新,6 准备好创建。
是否可以在已创建的 ShopProducts 上调用 PrintLocation.all.each{|p| @shop_product.shop_product_print_files.build(print_location: p)}
,因为与可能的打印位置相关的 shop_product_print_file 不存在。
例如……
使用打印位置创建了 ShopProduct,1、2、3(共 6 个可能)
现在,存在 print_location 的 shop_product_print_location 将在表单中显示以进行更新,因此这就是 1、2 和 3。我怎样才能拥有它以便其他3 未创建的现在显示更新 ShopProduct 并创建新的 ShopProductPrintFile?因此可以将 ShopProduct 更新为 print_locations 到 shop_product_print_file 模型。
I have a nested fields_for text_field not appearing, I am not sure
what I have been done wrong.
您应该在创建操作中添加这一行
@shop_product = ShopProduct.new(shop_product_params)
@shop_product.shop_product_print_files.build #this one
同时将 shop_product_print_file_attributes
更改为 shop_product_print_files_attributes
以避免任何进一步的错误。
您必须告诉 rails 在每次迭代中使用哪个 PrintLocation,因为您的对象没有任何
<%= f.fields_for :shop_product_print_files, print_location do |a| %>
我不太确定这是否是您想要的,但该字段会出现。
编辑:所以,我认为您需要这样的东西:
在控制器上
@shop_product = something_to_get_the_product
PrintLocation.all.each{|p| @shop_product.shop_product_print_files.build(print_location: p)}
我更喜欢在这里这样做,我不喜欢视图上的那种逻辑
现在您已经在商店产品对象上预先构建了所有可能的打印位置
在表格上
# note here the multipart option to allow files
<%= form_for @shop_product, multipart: true do |f| %>
<%= f.collection_select :product_id, @products, :id, :sku %>
<%= f.fields_for :shop_product_print_files do |ff| %>
<%= ff.object.print_location.title # get the print location from the association %>
<%= ff.hidden_field :print_location_id # save the print_location_id as a hidden field %>
<%= ff.file_field :print_file # file input %>
<% end %>
<%= f.submit %>
<% end %>
问题:我有一个嵌套的 fields_for text_field 没有出现,我不确定我做错了什么。
目标:在创建记录时,遍历具有预设变量的模型,并将文件(使用 text_field 进行测试)保存到连接 table,从而保存预设变量和表单记录 ID
型号:
class PrintLocation < ApplicationRecord
has_many :shop_products, through: :shop_product_print_files
has_many :shop_product_print_files
accepts_nested_attributes_for :shop_product_print_files
end
class ShopProductPrintFile < ApplicationRecord
belongs_to :shop_products
belongs_to :print_locations
end
class ShopProduct < ApplicationRecord
...
has_many :shop_product_print_files
has_many :print_locations, through: :shop_product_print_files
accepts_nested_attributes_for :print_locations
accepts_nested_attributes_for :shop_product_print_files
...
end
表格:
<%= form_for @shop_product do |f| %>
<%= f.collection_select :product_id, @products, :id, :sku %>
<% PrintLocation.all.each do |print_location| %>
<%= print_location.title %>
<%= f.fields_for :shop_product_print_files do |a| %>
<%= a.text_field :print_file %>
<% end %>
<% end %>
<%= f.submit %>
<% end %>
这样,text_field 不会出现,但 print_location.title
会出现。没有错误。
在保存 @shop_product
时,我希望能够遍历已定义的可能 print_location
变量,然后针对每个可能的 print_location
,然后能够上传文件(text_field 用于测试),然后将其保存到具有 shop_product_id
、print_location_id
和 print_file
属性的 ShopProductPrintFile 模型。
我对如何使用 fields_for
有什么误解吗?
店铺产品负责人:
创建:
@shop_product = ShopProduct.new(shop_product_params)
shop = Shop.find(params["shop_product"]["shop_id"])
product = Product.find(params["shop_product"]["product_id"]) @shop_product.product_id = product.id
@shop_product.shop_id = shop.id
respond_to do |format|
if @shop_product.save!
...
更新:
@shop_product = ShopProduct.find_by(store_variant_id: params["shop_product"]["store_variant_id"])
@product = Product.find(params["shop_product"]["product_id"])
强参数:
def shop_product_params
params.require(:shop_product).permit(:product_id, :store_product_id, :shop_id, :store_variant_id, :sync, :shop_product_print_file_attributes[:id, :print_files, :print_location_ids => [], :shop_product_ids => []], {print_location_ids: []})
end
更新 2:
更新和创建方法:
@shop_product.shop_product_print_files.build
形式:
<% PrintLocation.all.each do |print_location| %>
<%= print_location.title %>
<%= f.fields_for :shop_product_print_files_attributes do |a| %>
<%= a.text_field :print_file %>
<%= a.hidden_field :print_location_id, value: print_location.id %>
<%= a.hidden_field :shop_product_id, value: shop_product.id %>
<% end %>
<% end %>
参数:
def shop_product_params
params.require(:shop_product).permit(:shop_product_print_files_attributes => [:ids => [], :print_files => [], :print_location_ids => [], :shop_product_ids => []])
end
错误:
Shop product print files shop products must exist
Shop product print files print locations must exist
通过的参数:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"u/c103465uNCjF/trYrMleqxJ8b9wyLbU/vjPK4llYtCg/ODj92q5MN24==", "shop_product"=>{"sync"=>"1", "product_id"=>"3", "shop_product_print_files_attributes"=>{"print_file"=>"", "print_location_id"=>"6", "shop_product_id"=>"42"}, "store_product_id"=>"191234345", "store_variant_id"=>"15341234273", "id"=>"42"}, "commit"=>"Sync", "id"=>"42"}
模型没有改变。
参数中的打印文件仍然空白?
更新 3:
**使用这种形式:感谢@arieljuod **
<%= f.fields_for :shop_product_print_files do |ff| %>
<%= ff.object.print_location.title # get the print location from the association %>
<%= ff.hidden_field :print_location_id # save the print_location_id as a hidden field %>
<%= ff.file_field :print_file # file input %>
<% end %>
用这个在新的和方法中容纳视图:
@shop_product = ShopProduct.new
PrintLocation.all.each{|p| @shop_product.shop_product_print_files.build(print_location: p)}
正在创建。
由于 API 导致页面加载之前不知道 ShopProduct 的 ID,问题仍然存在,并且一个页面上可能有多个 ID。
我用:
<% if @shop_products.find_by(store_variant_id: variant.id) %>
<% shop_product = @shop_products.find_by(store_variant_id: variant.id) %>
<%= form_for shop_product do |f| %>
...
其中,variant
来自由 API:
<% @in_store_variants.each do |variant| %>
现在当使用shop_products
时(当variant.id
发现shop_product已经存在时),fields_for不会出现。假设这是因为没有相关记录存在。只有 shop_product.shop_product_print_files 存在才会出现。
据我所知,目前唯一的解决方法是保存所有 print_locations,但使用实际激活的布尔值,或搜索 print_locations 附加了 ID。但我宁愿不那样做,只保存在创建时选择的 print_locations(通过上传 print_file
选择)。
对于"fix"这个问题,本人:
添加了
accepts_nested_attributes_for reject_if: proc { |attributes| attributes['print_file'].blank? }
,它不会保存 ShopProductPrintFile,除非 print_file 字段提交了一些东西...使用此表格(2 个表格取决于是否存在)
<% if @shop_products.find_by(store_variant_id: variant.id) %> <%= form_for shop_product do |f| %> <% PrintLocation.all.each{|p| shop_product.shop_product_print_files.build(print_location: p)} %> <%= f.fields_for :shop_product_print_files do |ff| %> <%= ff.object.print_location.title %> <%= ff.hidden_field :print_location_id %> <%= ff.text_field :print_file %> <% end %> <%= f.submit "Sync" %> <% end %> <% else %> <%= form_for @shop_product do |f| %> <% PrintLocation.all.each{|p| @shop_product.shop_product_print_files.build(print_location: p)} %> <%= f.fields_for :shop_product_print_files do |ff| %> <%= ff.object.print_location.title %> <%= ff.hidden_field :print_location_id %> <%= ff.text_field :print_file %> <% end %> ...
2 的问题是我关联了 PrintLocation 1、2、3,它将显示 9 个字段,1、2、3 准备好更新,6 准备好创建。
是否可以在已创建的 ShopProducts 上调用 PrintLocation.all.each{|p| @shop_product.shop_product_print_files.build(print_location: p)}
,因为与可能的打印位置相关的 shop_product_print_file 不存在。
例如…… 使用打印位置创建了 ShopProduct,1、2、3(共 6 个可能)
现在,存在 print_location 的 shop_product_print_location 将在表单中显示以进行更新,因此这就是 1、2 和 3。我怎样才能拥有它以便其他3 未创建的现在显示更新 ShopProduct 并创建新的 ShopProductPrintFile?因此可以将 ShopProduct 更新为 print_locations 到 shop_product_print_file 模型。
I have a nested fields_for text_field not appearing, I am not sure what I have been done wrong.
您应该在创建操作中添加这一行
@shop_product = ShopProduct.new(shop_product_params)
@shop_product.shop_product_print_files.build #this one
同时将 shop_product_print_file_attributes
更改为 shop_product_print_files_attributes
以避免任何进一步的错误。
您必须告诉 rails 在每次迭代中使用哪个 PrintLocation,因为您的对象没有任何
<%= f.fields_for :shop_product_print_files, print_location do |a| %>
我不太确定这是否是您想要的,但该字段会出现。
编辑:所以,我认为您需要这样的东西:
在控制器上
@shop_product = something_to_get_the_product
PrintLocation.all.each{|p| @shop_product.shop_product_print_files.build(print_location: p)}
我更喜欢在这里这样做,我不喜欢视图上的那种逻辑
现在您已经在商店产品对象上预先构建了所有可能的打印位置
在表格上
# note here the multipart option to allow files
<%= form_for @shop_product, multipart: true do |f| %>
<%= f.collection_select :product_id, @products, :id, :sku %>
<%= f.fields_for :shop_product_print_files do |ff| %>
<%= ff.object.print_location.title # get the print location from the association %>
<%= ff.hidden_field :print_location_id # save the print_location_id as a hidden field %>
<%= ff.file_field :print_file # file input %>
<% end %>
<%= f.submit %>
<% end %>