Рельсы создают несколько записей в зависимости от флажков
У меня есть форма, которая позволяет мне создавать блюда с различными характеристиками, в них может быть от нуля до нескольких аллергенных ингредиентов, я бы хотел, чтобы пользователь мог выбирать типы аллергенов, если они присутствуют, и поэтому отправлять моей модели номер аллерген определен.
Я могу сделать это так @lunch.allergens << Allergen.new
но как извлечь массив из параметров с разрешением, я попробовал это так.
>> params.require(:lunch).permit(allergen: :ingredient_name)
=> <ActionController::Parameters {"allergen"=><ActionController::Parameters {} permitted: true>} permitted: true>
но я получаю пустой экземпляр, но я получаю хороший выбор в параметрах
>> params
=> <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"******************p07EnQ9JXeadUEPzY/HrX4GaeSm8ajYsP3KiV904VRrjNP54Ni8KL7gF/V2BTHOA==", "lunch"=><ActionController::Parameters {"title"=>"Salade césar et sauté de veau", "description"=>"sdqqsqsc", "portion"=>"3", "price"=>"14", "allergen"=><ActionController::Parameters {"ingredient_name"=>["", "0", "1", "2"]} permitted: false>, "formula"=>{"name"=>"2"}, "supply"=>{"name"=>"2"}, "time_slot"=>{"start_at(1i)"=>"2017", "start_at(2i)"=>"10", "start_at(3i)"=>"8", "start_at(4i)"=>"01", "start_at(5i)"=>"06", "duration"=>"3"}, "room"=>{"name"=>"dehor"}} permitted: false>, "commit"=>"Create Lunch", "controller"=>"lunches", "action"=>"create"} permitted: false>
Вы можете увидеть строку, содержащую нужный мне массив.
{"ingredient_name"=>["", "0", "1", "2"]}
проблема заключается в том, что имя_ ингредиента - это имя столбца таблицы Allergen, я понимаю, что есть логическая проблема, но как восстановить массив, допуская при этом поля ингредиента_наименования для всех экземпляров, которые мне, возможно, понадобится создать.
моя форма
<%= simple_form_for @lunch do |l| %>
<%= field_set_tag 'Votre menu' do %>
<%= l.input :title, label: 'Donnez un tire à votre lunch :', error: 'Veuillez specifier' %>
<%= l.input :description, label: 'Décriver ce qui compose votre lunch :', error: 'Veuillez specifier' %>
<%= l.input :portion, label: 'Quel nombre de portion aura votre lunch :', error: 'Veuillez specifier' %>
<%= l.input :price, label: 'Quel sera le prix d une portion :', error: 'Veuillez specifier' %>
<%= field_set_tag 'Allergenes' do %>
<%= l.simple_fields_for @allergen do |f| %>
<%= f.input :ingredient_name, as: :check_boxes, collection: Allergen.allergen_types, label: 'Veuillez selectionner une formule :', error: 'Veuillez specifier' %>
<% end %>
<% end %>
<%= field_set_tag 'Formules' do %>
<%= l.simple_fields_for @formula do |f| %>
<%= f.input :name, as: :radio_buttons, collection: Formula.formula_types, label: 'Veuillez selectionner une formule :', error: 'Veuillez specifier' %>
<% end %>
<% end %>
<% end %>
<%= field_set_tag 'Fournitures' do %>
<%= l.simple_fields_for @supply do |s| %>
<%= s.input :name, as: :radio_buttons, collection: Supply.supply_types, label: 'Indiquez si vous fournissez les couverts :', error: 'Veuillez specifier' %>
<% end %>
<% end %>
<%= field_set_tag 'Date et heure' do %>
<%= l.simple_fields_for @time_slot do |t| %>
<%= t.input :start_at, as: :datetime, label: 'Date et heure de debut :', error: 'Veuillez specifier' %>
<%= t.input :duration, label: 'Durée du lunch :', error: 'Veuillez specifier' %>
<%= field_set_tag 'Lieu' do %>
<%= l.simple_fields_for @room do |t| %>
<%= t.input :name, label: 'Lieu du lunch :', error: 'Veuillez specifier' %>
<% end %>
<% end %>
<% end %>
<% end %>
<%= l.button :submit %>
<% end %>
мой контроллер
class LunchesController < ApplicationController
before_action :set_lunch, only: [:edit, :show, :update, :destroy]
before_action :set_dependances, only: [:edit, :show, :update, :destroy]
def index
@lunches = Lunch.joins(user: :company).where(users: {company: current_user.company})
end
def new
@lunch = Lunch.new
@time_slot = TimeSlot.new
@supplies = Supply.all
@formulas = Formula.all
@formula = Formula.new
@supply = Supply.new
@room = Room.new
@allergen = Allergen.new
end
def create
raise
@formula = Formula.where(formula_params[:formula]).first
@supply = Supply.where(supply_params[:supply]).first
@room = Room.new(room_params[:room])
@room.company = current_user.company
@room.save!
@time_slot = TimeSlot.new(time_slot_params[:time_slot])
@time_slot.room = @room
@lunch = Lunch.new(lunch_params)
@lunch.formula = @formula
@lunch.supply = @supply
@lunch.time_slot = @time_slot
@lunch.user = current_user
if @lunch.save!
flash[:notice] = "Votre lunch à bien était créer"
redirect_to lunch_path(@lunch)
else
render :new
end
end
def show
end
def edit
end
def update
raise
@formula.update(formula_params[:formula])
@supply.update(supply_params[:supply])
@room.update(room_params[:room])
@time_slot.room = @room
@time_slot.update(time_slot_params[:time_slot])
@lunch.formula = @formula
@lunch.supply = @supply
@lunch.time_slot = @time_slot
@lunch.user = current_user
if @lunch.update!(lunch_params)
flash[:notice] = "Votre lunch a bien été modifié"
redirect_to lunches_path
else
render :edit
end
end
def destroy
@lunch.destroy
redirect_to allergens_path
end
private
def set_lunch
@lunch = Lunch.find(params[:id])
end
def set_dependances
@supply = @lunch.supply
@formula = @lunch.formula
@room = @lunch.room
@time_slot = @lunch.time_slot
end
def lunch_params
params.require(:lunch).permit(:portion, :title, :description, :price)
end
def allergen_params
params.require(:lunch).permit(allergen: [:ingredient_name])
end
def formula_params
params.require(:lunch).permit(formula: [:name])
end
def supply_params
params.require(:lunch).permit(supply:[:name])
end
def time_slot_params
params.require(:lunch).permit(time_slot: [:start_at, :duration])
end
def room_params
params.require(:lunch).permit(room: [:name])
end
end