Вложенная форма модели с коллекцией в Rails 2.3 - PullRequest
0 голосов
/ 20 августа 2009

Как я могу заставить это работать в 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 %>

Проблема в том, что если я хочу отправить коллекцию журнальных страниц, жалоб на активную запись, потому что ожидается модель, а не массив.

создать действие:

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

Ответы [ 2 ]

0 голосов
/ 30 июля 2011

В журнале:

accept_nested_attributes_for: magazinepages

Magazine.new (params [: magazine]) автоматически обработает для вас иерархию объектов

0 голосов
/ 21 августа 2009

Я не на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...