Модель вложенной формы Ruby on rails

Я пытаюсь использовать вложенный помощник form_for для rails, но получаю следующую ошибку:

BlogPage(#49859550) ожидалось, получено Array(#31117360)

Вот мои объекты модели:

class Blog < ActiveRecord::Base
  # Table Configuration
  set_table_name "blog"

 # Model Configuration
 belongs_to :item
 has_many :blog_pages
 accepts_nested_attributes_for :blog_pages, :allow_destroy => true
end

class BlogPage < ActiveRecord::Base
  # Table Configuration
  set_table_name "blog_page"

  # Model Configuration
  belongs_to :blog
end

Вот форма, которую я сгенерировал (опустив ненужный HTML):

<% form_for :blog, :url => { :action => :create } do |blog_form| %>  
    <%= blog_form.text_field :title, :style => "width: 400px" %>  
    <% blog_form.fields_for :blog_pages do |page_fields| %>
        <% @blog.blog_pages.each do |page| %>  
            <%= page_fields.text_area :content, :style => "width: 100%",
                :cols => "10", :rows => "20" %>
        <% end %>
    <% end %>
<% end %>

Вот параметры, которые отправляются на контроллер:

{"commit"=>"Сохранить", "blog"=>{"blog_pages"=>{"content"=>"Это новое содержимое записей блога."}, "title"=>"Это новый блог запись.", "complete"=>"1"}, "authenticity_token"=>"T1Pr1g9e2AjEMyjtMjLi/ocrDLXzlw6meWoLW5LvFzc="}

Вот BlogsController с выполняемым действием создания:

class BlogsController < ApplicationController
  def new
    @blog = Blog.new # This is the line where the error gets thrown.  
    # Set up a page for the new blog so the view is displayed properly.
    @blog.blog_pages[0] = BlogPage.new
    @blog.blog_pages[0].page_number = 1
    respond_to do |format|
      format.html # Goes to the new.html.erb view.
      format.xml { render :xml => @blog }
      format.js { render :layout => false}
    end
  end

  def create
    @blog = Blog.new(params[:blog])

    respond_to do |format|
      if @blog.save
        render :action => :show
      else
        flash[:notice] = "Error occurred while saving the blog entry."
        render :action => :new
      end
    end
  end
end

Если кто-нибудь может помочь мне с этим, я был бы очень признателен. Я все еще довольно новичок в ruby ​​​​и фреймворке rails и не смог решить проблему самостоятельно, погуглив.

Спасибо.


person Brian DiCasa    schedule 02.02.2010    source источник
comment
Вы должны добавить номер строки и комментарий в свой код, где возникает ошибка. Вы также должны перенаправить, если @blog.save успешно. В настоящее время обновление браузера может привести к вставке повторяющихся записей. требуют 'pp' и используйте 'raise @blog.pretty_inspect', чтобы увидеть, какой массив у вас есть.   -  person Samuel Danielson    schedule 02.02.2010
comment
Спасибо. Я добавил некоторые из советов, которые вы рекомендовали. Что делает добавление требует 'pp'?   -  person Brian DiCasa    schedule 03.02.2010


Ответы (2)


Вы видели это?

http://media.pragprog.com/titles/fr_arr/multiple_models_one_form.pdf

person MikeH    schedule 02.02.2010
comment
Спасибо за ссылку. Я не уверен, следует ли мне больше использовать этот подход, потому что кажется, что было бы проще использовать field_for, не вложенный в модель, и просто добавить немного логики в контроллер. - person Brian DiCasa; 02.02.2010

Измените форму на эту:

<% form_for :blog, :url => { :action => :create } do |blog_form| %>  
    <%= blog_form.text_field :title, :style => "width: 400px" %>  
    <% blog_form.fields_for :blog_pages do |page_fields| %>
            <%= page_fields.text_area :content, :style => "width: 100%",
                :cols => "10", :rows => "20" %>
    <% end %>
<% end %>

Если вы используете fields_for, он автоматически перебирает страницы блога. Однако я не уверен, что это вызвало ошибки.

person klew    schedule 02.02.2010