Поля для записи в ассоциации «имеет много» внутри формы - PullRequest
3 голосов
/ 29 января 2011

У меня есть Topic, у которого много Post с. Когда создается тема, вместе с ней создается первое сообщение.

Я включил поля сообщения в форму:

= form_for @topic do |topic_form|

  # ...

  = topic_form.fields_for @post do |post_fields|
    = post_fields.label :content
    %br/
    = post_fields.text_area :content
    %br/

Вот как выглядит мой TopicsController:

def new
  @topic = Topic.new
  @post = Post.new
  respond_with @topic
end

def create
  @topic = Topic.create params[:topic]
  @post = @topic.create_post params[:topic][:post]
  respond_with @topic, location: topic_url(@topic)
end

Я получаю UnknownAttributeError - unknown attribute: post в первой строке create метода. Я предполагаю, что это потому, что хеш поста был включен в хеш темы в запросе * 1014

"topic" => { "title" => "...", "post" => { "content" => "..." } }

Как мне обойти эту ситуацию?

1 Ответ

4 голосов
/ 29 января 2011
  1. Ваша модель Topic должна иметь accepts_nested_attributes_for :posts.
  2. Ваша форма должна иметь = topic_form.fields_for :posts do |post_fields| вместо @post.
  3. Ни ваши new, ни ваши create методы не нуждаются в @post = .... строках. Когда вы сохраните @topic, он автоматически сохранит для вас новый связанный пост.

Вот отличное объяснение вложенных атрибутов в формах: http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes

...