嵌套模型表单与Rails 2.3中的集合

时间:2009-08-20 18:32:08

标签: ruby-on-rails

如何在Rails 2.3中完成这项工作?

class Magazine < ActiveRecord::Base
  has_many :magazinepages
end

class Magazinepage < ActiveRecord::Base
  belongs_to :magazine
end

然后在控制器中:

def new
  @magazine = Magazine.new
  @magazinepages = @magazine.magazinepages.build
end

然后是表格:

<% form_for(@magazine) do |f| %>
  <%= error_messages_for :magazine %>
  <%= error_messages_for :magazinepages %>
  <fieldset>
    <legend><%= t('new_magazine') %></legend>
      <p>
        <%= f.label :title %>
        <%= f.text_field :title %>
      </p>
      <fieldset>
        <legend><%= t('new_magazine_pages') %>
          <% f.fields_for :magazinepages do |p| %>
            <p>
              <%= p.label :name %>
              <%= p.text_field :name %>
            </p>
            <p>
              <%= p.file_field :filepath %>
            </p>
          <% end %>
      </fieldset>
    <p>
      <%= f.submit :save %>
    </p>
  </fieldset>
<% end %>

问题是,如果我想提交一个杂志页面,activerecord投诉的集合,因为它是一个模型,而不是一个数组。

创建行动:

def create
  @magazine = Magazine.new params[:magazine]
  @magazine.save ? redirect_to(@magazine) : render(:action => 'new')
end

2 个答案:

答案 0 :(得分:0)

我不是100%肯定你在问什么,但是如果你想要实例化一本新杂志,有很多杂志页面,你需要遍历每个杂志页面。像这样:

def create
  @magazine = Magazine.new(params[:magazine])
  if params[:magazinepages]
    params[:magazinepages].each do |page|
      @magazine.magazinepages.build(page)
    end
  end

  # Save the model, do your redirection or rendering invalid model etc
end

答案 1 :(得分:0)

杂志:

accepts_nested_attributes_for:magazinepages

Magazine.new(params [:magazine])将自动为您处理对象层次结构