Вложенная форма не сохраняется

Я использую драгоценный камень кокона для создания вложенной формы. У меня есть модель мероприятия, в которой много билетов и организаторов.

МОДЕЛЬ СОБЫТИЯ:

class Event < ActiveRecord::Base
  has_many :organizers, dependent: :destroy
  has_many :tickets, dependent: :destroy

  accepts_nested_attributes_for :tickets, reject_if: :all_blank, allow_destroy: true
  accepts_nested_attributes_for :organizers, reject_if: :all_blank, allow_destroy: true

end

МОДЕЛЬ ОРГАНИЗАТОРА:

class Organizer < ActiveRecord::Base
  belongs_to :user
  belongs_to :event

  validates :user, presence: true
  validates :event, presence: true
end

МОДЕЛЬ БИЛЕТА:

class Ticket < ActiveRecord::Base
  belongs_to :event
  has_many :bookings
end

КОНТРОЛЕР СОБЫТИЙ:

class EventsController < ApplicationController
  def new
    @event = Event.new
  end

  def create 
    @event = Event.new(event_params)
    if @event.save
      redirect_to event_path(@event)
    else
      render 'new'
    end 
  end

  def edit
    @event = Event.friendly.find(params[:id])
  end

  def update
    @event = Event.friendly.find(params[:id])
    @event.update_attributes event_params
    if @event.save
      redirect_to event_path(@event), flash: { success: "Event updated succesfully." }
    else
      render 'edit'
    end 
  end

  private
  def event_params
    params.require(:event).permit(:title,:description, tickets_attributes: [:id, :event_id, :title, :limit, :_destroy], organizers_attributes: [:id, :event_id, :user_id, :_destroy])
  end
end

НОВЫЙ ВИД

<%= simple_form_for @event, url: events_path do |f| %>
  <%= f.input :title %>
  <%= f.input :description %> 
  <div id="tickets">
    <%= f.simple_fields_for :tickets do |ticket| %>
      <%= render 'ticket_fields', f: ticket %>
    <% end %>
    <div class="links">
      <%= link_to_add_association 'add ticket', f, :tickets %>
    </div>
  </div>
  <div id="organizers">
    <%= f.simple_fields_for :organizers do |organizer| %>
      <%= render 'organizer_fields', f: organizer %>
    <% end %>
    <div class="links">
      <%= link_to_add_association 'add organizer', f, :organizers %>
    </div>
  </div>

  <%= f.button :submit %>
<% end %>

ОРГАНИЗАТОРЫ ПОЛЕ ЧАСТИЧНО:

<div class="nested-fields">
  <%= f.input :user, collection: User.all, label_method: lambda { |user| user.email } %>
  <%= link_to_remove_association "remove organizer", f %>
</div>

ПОЛЕ БИЛЕТОВ ЧАСТИЧНО:

<div class="nested-fields">
  <%= f.input :title %>
  <%= f.input :limit, disabled: f.object.no_limit %>
  <%= f.input :no_limit %>
  <%= link_to_remove_association "remove ticket", f %>
</div>

ЖУРНАЛЫ СЕРВЕРА:

Parameters: 
  {
    "utf8"=>"✓", 
    "authenticity_token"=>"rct6..", 
    "event"=>{
      "title"=>"zdtfbvc", 
      "description"=>"fdxcv", 
      "tickets_attributes"=>{
        "1441016179377"=>{
          "title"=>"tdhfgb", 
          "limit"=>"2", 
          "_destroy"=>"false"
        }
      }, 
      "organizers_attributes"=>{
        "1441017842699"=>{
          "user"=>"3", 
          "_destroy"=>"false"
        }, 
        "1441017845556"=>{
          "user"=>"2", 
          "_destroy"=>"false"
        }
      }
    }, 
    "commit"=>"Create Event"
  }

Проблема в том, что билеты созданы и сохранены в базе данных, а организаторы - нет.


person Oscar    schedule 31.08.2015    source источник
comment
Можете скинуть код формы?   -  person Pavan    schedule 31.08.2015


Ответы (1)


Проблема, вероятно, в том, что Модель Организатора проверяет наличие события, хотя событие еще не создано.

Если вы хотите проверить в этом случае, вы должны добавить inverse_of следующим образом:

class Organizer < ActiveRecord::Base
  belongs_to :user
  belongs_to :event, inverse_of: :organizers

  validates :user, presence: true
  validates :event, presence: true
end

class Event < ActiveRecord::Base
  has_many :organizers, dependent: :destroy, inverse_of: :event
  has_many :tickets, dependent: :destroy

  accepts_nested_attributes_for :tickets, reject_if: :all_blank, allow_destroy: true
  accepts_nested_attributes_for :organizers, reject_if: :all_blank, allow_destroy: true
end

См.: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html#module-ActiveRecord::NestedAttributes::ClassMethods-label-Validating+the+presence+of+a+parent+model

person IngoAlbers    schedule 31.08.2015
comment
Я проверил ваш вариант, но проблема осталась. Спасибо за ваше время. - person Oscar; 01.09.2015