2014-02-04 6 views
0

У меня возникла проблема создания вложенной полиморфной формы. Я выполняю решение от этой проблемы:Полиморфная вложенная форма

Rails: has_many through with polymorphic association - will this work?

Описания было: человек может иметь много событий и каждое событие может иметь один полиморфный Eventable запись

Вот соответствующие модели:

class Event < ActiveRecord::Base 
    belongs_to :person 
    belongs_to :eventable, :polymorphic => true 
end 

class Meal < ActiveRecord::Base 
    has_one :event, :as => eventable 
end 

class Workout < ActiveRecord::Base 
    has_one :event, :as => eventable 
end 

class Person < ActiveRecord::Base 
    has_many :events 
    has_many :meals, :through => :events, :source => :eventable, 
    :source_type => "Meal" 
    has_many :workouts, :through => :events, :source => :eventable, 
    :source_type => "Workout" 
end 

Мой контроллер выглядит следующим образом:

def 
    @person = Person.new 
    @person.meals.new 
    @person.workouts.new 
new 

мой взгляд выглядит следующим образом:

<%= form_for @person do |person| %> 
<%= person.fields_for :meals, @person.meals.build do |meals| %> 
    <%= meals.text_field :food %> 
    <% end %> 
<% end %> 

Ошибка Сейчас я получаю:

неизвестный атрибут: person_id

Я думаю, что полиморфные ассоциации мешает создание потому что еда не может быть создана до тех пор, пока человек не будет создан? Правильно ли я создал форму? Благодаря!

+1

У вас есть 'person_id' столбец как целое число в' events' таблицы? Кроме того, я думаю, что код контроллера, который вы предоставили, может быть ошибочным? – Surya

+0

Я думаю, вам не нужно @ person.meals.build –

+0

Нет, в таблице событий нет person_id. О, как обмануто? – guy8214

ответ

0

Вам необходимо включить атрибут person_id в events таблице (в соответствии с belongs_to ассоциации)

Есть также некоторые другие вопросы, вы должны решить:


контроллер

def new 
    @person = Person.build 
end 

def create 
    @person = Person.new(person_attributes) 
    @person.save 
end 

private 

def person_attributes 
    params.require(:person).permit(:your, :attributes, events_attributes: [:eventable_type, :eventable_id, meal_attributes: [:params], workout_attributes: [:params]]) 
end 

Модели

#app/models/person.rb 
Class Person < ActiveRecord::Base 
    has_many :events 
    has_many :meals, :through => :events, :source => :eventable, 
     :source_type => "Meal" 
    has_many :workouts, :through => :events, :source => :eventable, 
     :source_type => "Workout" 

    def self.build 
     person = Person.new 
     person.events.build.build_meal 
     person.events.build.build_workout 
    end 

end 

Просмотров

#app/views/people/new.html.erb 
<%= form_for @person do |person| %> 
<%= person.fields_for :events do |e| %> 
    <%= e.fields_for :meal %> 
     <%= e.text_field :food %> 
    <% end %> 
    <% end %> 
<% end %> 
+0

Спасибо за ответ Rich. Теперь я получаю неизвестный атрибут: eventable_id. Это потому, что события являются полиморфной связью и должны знать идентификатор Meal, прежде чем он сможет создать себя? – guy8214

Смежные вопросы