2010-02-02 1 views
1

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

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 %> 

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

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

Здесь BlogController с созданным действием, которое выполняется:

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 

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

Спасибо.

+0

Вы должны добавить номер строки и прокомментировать код, в котором произошла ошибка. Вы также должны перенаправить, если @ blog.save успешно. То, как это происходит сейчас, обновление браузера может привести к тому, что будут вставлены повторяющиеся записи. требуйте «pp» и используйте «raise @ blog.pretty_inspect», чтобы узнать, какой у вас массив. –

+0

Спасибо. Я добавил некоторые предложения, которые вы рекомендовали. Что добавление требует «pp»? –

ответ

1
+0

Спасибо за ссылку. Я не уверен, должен ли я использовать этот подход больше, хотя, похоже, было бы проще использовать field_for, не вложенные в модель, и просто добавить немного логики в контроллер. –

0

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

<% 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 он перебирает blog_pages автоматически. Однако я не уверен, что это вызвало ошибки.