Вложенная форма 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 как в вашей форме (это часть соглашения по конфигурации на рельсах)

Другие вопросы по тегам