Я настроил форму form_tag для обновления нескольких записей из массива из следующего учебника: http://railscasts.com/episodes/165-edit-multiple-revised (# 3)
Цель : Создать форму для одновременной загрузки файлов в несколько записей. Вместо того, чтобы делать это для каждой записи.
Пример : загрузить файл example.png сразу в 3 записи через одну форму в связанную модель.
Я правильно выполнил урок (# 3), но не могу включить вложенные поля
Я получаю сообщение об ошибке:
(неопределенный метод `print_location 'для nil: NilClass)
Контроллер
def edit_multiple
@image_files = ImageFile.where(user_id: current_user.id)
@shop_products = ShopProduct.find(params[:shop_product_ids])
end
def update_multiple
@shop_products = ShopProduct.find(params[:shop_product_ids])
@image_files = ImageFile.where(user_id: current_user.id)
@shop_products.reject! do |shop_product|
shop_product.update_attributes(params[:shop_product].reject { |k,v| v.blank? })
end
if @shop_products.empty?
redirect_to shop_products_url
else
@shop_product = ShopProduct.new(params[:shop_product])
render "edit_multiple"
end
end
Маршруты
resources :shop_products do
collection do
get :edit_multiple
put :update_multiple
end
end
Форма для выберите ShopProduct's для обновления form_tag:
<%= form_tag edit_multiple_shop_products_path, method: :get do %>
...
<% multiple_shop_products.each do |shop_product| %>
<%= check_box_tag "shop_product_ids[]", shop_product.id %>
...
<% end %>
<%= submit_tag "Add Image(s)" %>
<% end %>
<% end %>
Параметры передаются, а метод edit_multiple
получает и находит ShopProduct
Форма в файле edit_multiple.html.erb
:
<%= form_tag edit_multiple_shop_products_path, method: :put do %>
<% @shop_products.each do |shop_product| %>
<%= hidden_field_tag "shop_product_ids[]", shop_product.id %>
<%= shop_product.id %>
<% end %>
<%= fields_for :shop_product do |f| %>
<%= f.fields_for :shop_product_print_files do |ff| %>
<%= ff.object.print_location.title %>
<%= ff.hidden_field :print_location_id %>
<%= ff.select :image_file_id, options_for_select(@image_files.map { |image| [image.id, {'data-img-src'=>image.image_file_url(:thumb)}]}), {:include_blank => 'Choose None'}, class: "image-picker" %>
Upload: <%= link_to "Add Image", user_files_path %>
<% end %>
<% end %>
<%= submit_tag "Edit Checked" %>
<% end %>
Я не могу сообщить рельсам, какой PrintLocation использовать, любым способом, который я пробовал. Который, я хочу, чтобы пройти все из них
Когда я обновляю ShopProduct индивидуально, я использую:
<% PrintLocation.all.each{|p| shop_product.shop_product_print_files.build(print_location: p) if shop_product.shop_product_print_files.where(print_location: p).empty? } %>
Который можно использовать во внешней части формы или в контроллере. Это позволяет print_locations появляться, если он создан, он отображает редактирование, если нет, то он отображает новый.
Вопросы : Как реализовать отображение PrintLocation в этом теге формы?
Модель
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