Вложенная форма Rails 4 "Unpermitted Parameters" не получена где-либо еще
Моя вложенная форма не работает должным образом, независимо от того, что я пытаюсь, и я искал все StackExchange, чтобы найти решение этой, казалось бы, простой проблемы. Это то место, где я сейчас нахожусь, чтобы заставить его работать на показе в представлении вообще.
Форма использует действие создания контроллера событий из невозобновляемого местоположения, отсюда и глобальная переменная (контроллер страниц с определенной страницей, где генерируется форма). Моя модель заявки генерируется при отправке вложенной формы и передается идентификатор события, но она не заполняет поле "Имя" для модели заявки, поскольку в нем указано "Unpermitted Parameters: Ticket". Но они определены как внесенные в белый список в контроллере событий! Argh! Я думаю, что-то не так с формой, но все, что я пытаюсь сделать, похоже, не работает.
Любая помощь будет оценена.
* ОБНОВЛЕННЫЙ КОД, КОТОРЫЙ СЕЙЧАС РАБОТАЕТ *
Form.html.erb:
<div class="form-inputs">
<%= simple_form_for @event, :html => { :class => 'form-horizontal' } do |f| %>
<div class="row">
<div class="col-xs-6">
<%= f.input :name, class: "control-label" %>
</div>
</div>
<div class="row">
<div class="col-xs-6">
<%= f.simple_fields_for :tickets do |ticket| %>
<%= ticket.input :name %>
<% end %>
</div>
</div>
<div class="form-actions">
<%= f.button :submit, :class => 'btn-primary' %>
<%= link_to t('.cancel', :default => t("helpers.links.cancel")),
launchpad_path, :class => 'btn btn-default' %>
<% end %>
</div>
</div>
Event_Controller.rb
def new (this is totally skipped and unnecessary)
@event = Event.new
@ticket = @event.tickets.build
end
def create
@event = current_user.events.build(event_params)
respond_to do |format|
if @event.save
format.html { redirect_to @event, notice: 'Your event was created.' }
else
format.html { render :new }
end
end
end
def event_params
params.require(:event).permit(:name, tickets_attributes: [ :name, :id, :event_id, :_destroy ])
end
Pages_Controller.rb (откуда берутся формы
def new
@event = Event.new
@ticket = @event.tickets.build
end
Event.rb
class Event < ActiveRecord::Base
# Database Relationships
has_many :tickets, dependent: :destroy
accepts_nested_attributes_for :tickets, :allow_destroy => true
end
Ticket.rb
class Ticket < ActiveRecord::Base
belongs_to :event
end
routes.rb
resources :events do
resources :tickets
end
3 ответа
Я застрял в той же проблеме, как сумасшедший, и в конце концов я смог это исправить... Попробуйте поместить binding.pry в первую строку метода create и напечатайте хеш event_params и проверьте, видите ли вы внутри него хэш ticket_attributes... вот тогда он выдаст недопустимый параметр... И я вижу событие has_many tickets, так что я предполагаю, что ticket_attributes должен быть во множественном числе, чтобы быть tickets_attributes
Помимо информации от Алехандро (что правильно), у вас также есть f.simple_fields_for @ticket, ...
тогда как вы должны иметь f.simple_fields_for :tickets, ...
Если вы проверите log/development.log
для Processing by EventsController#create
линия после будет Parameters:
линии, вы увидите, что параметры, которые были отправлены через находятся под :ticket
ключ вместо :tickets_attributes
ключ из-за fields_for
ошибка.
Исправьте это, и permit
линия, и вы должны быть в порядке.
Обновить
Надеюсь, вы поняли, что вам также не нужно @ticket = @event.tickets.build(event_params[:ticket_attributes])
линия вообще однажды fields_for
тоже исправлено. Настройка всех связанных tickets
все сделано через Event
объект благодаря accepts_nested_attributes_for
помощник.
Просто удалите из действия создания эту строку:
@ticket = @event.tickets.build(event_params[:ticket_attributes])
И измените ваши event_params:
def event_params
params.require(:event).permit(:name, :main_event_image, tickets_attributes: [:id, :name, :cost, :event_id, :registration_id, :created_at])
end
Имя поля должно быть: tickets_attributes: [ ...
(билеты во множественном числе). Я думаю, что это делает свое дело.
Изменить: я согласен с @smathy, если не исправить f.simple_fields_for :tickets ...
это не может работать.
Ваш новый метод должен выглядеть так:
def new
@new_event = Event.new
@new_event.tickets.build
end
Я фанат стандартов, и я предпочитаю использовать @event
вместо @new_event
как в вашей форме (это часть соглашения по конфигурации на рельсах)