Нет ошибки метода при использовании формы для обновления нескольких записей (массив) с вложенными fields_for form_tag - PullRequest
0 голосов
/ 11 июля 2019

Я настроил форму 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...