#ruby-on-rails #ruby-on-rails-4 #ruby-on-rails-5
#ruby-on-rails #ruby-on-rails-4 #ruby-on-rails-5
Вопрос:
Я хочу отправить несколько объектов (массив хэшей) одной и той же модели из одной формы. Мои параметры показывают только один объект, даже если я пытаюсь отправить более одного.
Мои параметры выглядят так:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"adjbzaCNxfw==", "serialized_products"=>{"product_id"=>"2", "location_id"=>"1", "serial"=>"1234567890"}, "commit"=>"Save changes"}
Я ожидаю, что ключ в хэше параметров вызывается serialized_products
с помощью массива сериализованных продуктов, таких как:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"bbT3qiNZxFrO9RYLL3g==", "serialized_products"=>[{"product_id"=>"1", "location_id"=>"1", "serial"=>"2345454353454"}, {"product_id"=>"1", "location_id"=>"1", "serial"=>""}, {"product_id"=>"1", "location_id"=>"1", "serial"=>""}, {"product_id"=>"2", "location_id"=>"1", "serial"=>"454356536556"}, {"product_id"=>"2", "location_id"=>"1", "serial"=>""}], "commit"=>"Save changes"}
Я получаю эту ошибку при отправке формы:
undefined method 'permit' for "product_id":String Did you mean? print
До обновления до Rails 5 с Rails 4.2 все работало нормально.
У меня есть следующий код, адаптированный отсюда:
http://vicfriedman.github.io/blog/2015/07/18/create-multiple-objects-from-single-form-in-rails/
Форма:
<%= form_tag serialized_products_path do %>
<% @serialized_products.each do |product| %>
<%= fields_for 'serialized_products[]', product do |p| %>
<%= p.label :product_id %><br>
<%= p.text_field :product_id %>
<%= p.label :location_id %><br>
<%= p.text_field :location_id %>
<%= p.label :serial %><br>
<%= p.text_field :serial %>
<% end %>
<% end %>
<%= submit_tag %>
<% end %>
Контроллер SerializedProducts:
class SerializedProductsController < ApplicationController
before_action :set_serialized_product, only: [:show, :edit, :update, :destroy]
def new
if session[:reference] == nil or session[:location_id] == nil or session[:line_item_ids] == nil
print "nnSession is nil.nn"
redirect_back(fallback_location: root_path)
end
@reference = session[:reference]
location_id = session[:location_id]
@line_items = InventoryAdjustmentItem.where(id: session[:line_item_ids])
@serialized_products = []
@line_items.each do |line_item|
(line_item.quantity).times do
@serialized_products.push(SerializedProduct.new(product_id: line_item.product_id, location_id: location_id))
end
end
end
def create
params["serialized_products"].each do |serialized_product|
if serialized_product["serial"].present?
SerializedProduct.create(serialized_product_params(serialized_product))
end
end
redirect_to :root, notice: 'Serialized product was successfully created.'
session[:reference] = nil
session[:location_id] = nil
session[:line_item_ids] = nil
end
private
def set_serialized_product
@serialized_product = SerializedProduct.find(params[:id])
end
def serialized_product_params(my_params)
my_params.permit(:product_id, :location_id, :serial)
end
end
Комментарии:
1. Я рассмотрю это не то, что я изначально думал
2. Используйте
accepts_nested_attributes
иfields_for
ассоциацию.3. @max Какая ассоциация? Это та же модель.
4. можете ли вы вставить значение
params["serialized_products"]