Rails 3 вложенная модель формы, 2 уровня в глубину с помощью accepts_nested_attributes_for - PullRequest
12 голосов
/ 09 мая 2011

Моя вложенная модель отлично работает на первом уровне.Но у меня сложилось впечатление, что вы можете пройти много уровней, используя accepts_nested_attributes_for.Но когда я пытаюсь выполнить приведенный ниже код, атрибуты «Изображение» присоединяются к модели «Вопрос» верхнего уровня, и она не работает при отправке формы с неизвестным атрибутом «Изображение».

Я мог бы делать вставки вручную, используя данные формы, но если бы Rails мог обрабатывать их автоматически, было бы лучше по очевидным причинам.

Что я делаю неправильно?Я пытался изменить | af |в "поля для: image do" к собственному уникальному имени, но оно не имело никакого эффекта.

Модели:

class Question < ActiveRecord::Base
  has_one :answer
  accepts_nested_attributes_for :answer
end

class Answer < ActiveRecord::Base
  belongs_to :question
  has_one :image
  accepts_nested_attributes_for :image
end

class Image < ActiveRecord::Base
  belongs_to :answer
end

Контроллер:

def new
    @question = Question.new
    answer = @question.build_answer
    image = answer.build_image

    @case_id = params[:id]

    render :layout => 'application', :template => '/questions/form' 
end

def create
  question_data = params[:question]
  @question = Question.new(question_data)
  if @question.save
  ...
end

Вид:

= form_for @question, :html => {:multipart => true} do |f|

  = f.label :text, "Question Text:"
  = f.text_area :text, :rows => 7

  %br
  %br

  =f.fields_for :answer, do |af|
    = af.label :body, "Answer Text:"
    = af.text_area :body, :rows => 7

    %br
    %br

    = f.fields_for :image do |af|
      = af.label :title, "Image Title:"
      = af.text_field :title

      %br

      = af.label :file, "Image File:"
      = af.file_field :file

      %br

      = af.label :caption, "Image Caption:"
      = af.text_area :caption, :rows => 7

  = hidden_field_tag("case_id", value = @case_id)

  = f.submit

1 Ответ

8 голосов
/ 09 мая 2011

Я думаю, что вы немного перепутали переменные формы.Это должно быть:

= form_for @question, :html => {:multipart => true} do |f|

  = f.label :text, "Question Text:"
  = f.text_area :text, :rows => 7

  %br
  %br

  =f.fields_for :answer, do |af|
    = af.label :body, "Answer Text:"
    = af.text_area :body, :rows => 7

    %br
    %br

    = af.fields_for :image do |img_form|
      = img_form.label :title, "Image Title:"
      = img_form.text_field :title

      %br

      = img_form.label :file, "Image File:"
      = img_form.file_field :file

      %br

      = img_form.label :caption, "Image Caption:"
      = img_form.text_area :caption, :rows => 7

  = hidden_field_tag("case_id", value = @case_id)

  = f.submit

Обратите внимание, как form_for ... do |f| порождает f.fields_for ... do |af|, что, в свою очередь, порождает af.fields_for ... do |img_form|.

Ключ - второй fields_for.Это должно быть af.fields_for :image do |img_form|, а не f.fields_for :image do |img_form|.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...