Вложенные модельные формы. Как создать объект с помощью ассоциации, если он еще не существует? - PullRequest
1 голос
/ 29 марта 2011

Из серии Райана Бейтса о вложенных модельных формах я смог создать проект с concerts, bands и performances, в которые они играют.Я могу добавить выступления к новому концерту или когда я редактирую концерт.Это довольно просто и понятно, когда я следую его руководству.

performances принадлежит bands, а performances принадлежит concerts.На спектакле будет показан список играющих групп и время начала / окончания.В названиях групп есть только строковый столбец.

Когда я создаю новый концерт и добавляю целый ряд выступлений, я хотел бы, в то же время, иметь возможность создавать объекты bandесли они еще не существуют.В противном случае у пользователя есть дополнительные этапы создания этих объектов, что было бы утомительно.

Как, с помощью accepts_nested_attributes_for или какой-либо другой полезной функции Rails, я могу это сделать?Я использую Rails 2.3.8

Вот мои ассоциации:

class Band < ActiveRecord::Base
  has_many :performances
  has_many :concerts, :through => :performances
end

class Concert < ActiveRecord::Base
  has_many :performances
  has_many :bands, :through => :performances
  accepts_nested_attributes_for :performances, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true
end

class Performance < ActiveRecord::Base
  belongs_to :band
  belongs_to :concert
end

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

Rails может справиться с этим для вас, вам просто нужно убедиться, что вы правильно указали в параметрах (что должны сделать несколько вложенных форм)

class Concert < ActiveRecord::Base
  has_many :performances
  has_many :bands, :through => :performances

  accepts_nested_attributes_for :performances
end


class Performance < ActiveRecord::Base
  belongs_to :concert
  has_many :bands

  accepts_nested_attributes_for :bands
end


class Band < ActiveRecord::Base
  belongs_to :performance
end

Ваш хэш params должен выглядетькак это:

{
  :concert => {
    :performances_attributes => [
      {
        :bands_attributes => [
          {
            :name => "test u"
          }],
        :name=>"test p"
      }], 
    :name=>"test"
  }
}
0 голосов
/ 29 марта 2011

Вы должны использовать метод сборки, указанный выше, чтобы поля отображались в вашей формеНиже описано, как настроить форму.

<%= form_for @concert do |cf| %>  
  <%= cf.label :name %>  
  <%= cf.text_field :name %>  
  <%= cf.fields_for :performances do |pf| do %>  
     <%= pf.label :some_attr %>  
     ...  
     <%= pf.fields_for :bands do |bf| %>  
          <%= bf.label ... %>  
     <%end>  
  <% end %>  
<% end %>  
0 голосов
/ 29 марта 2011

Вы build новые пустые экземпляры ассоциации, которую вы хотите создать.В случае belongs_to, метод для создания экземпляра ассоциации - "build_#{association_name}", поэтому, если вы хотите создать новую полосу с производительностью, которая accepts_nested_attributes_for :band, вы бы инициализировали пустую полосу в методе вашего контроллера:

class PerformancesController < ApplicationController
  def new
    @performance = Performance.new       # You're building 
                                         # the performance to create
    @performance.build_band              # You're building
                                         # the band to create
  end
end

Метод построения для ассоциаций has_many: "#{association_name}.build, поэтому для полосы, которая accepts_nested_attributes_for :performances:

class BandsController < ApplicationController
  def new
    @band = Band.new
    3.times { @band.performances.build }
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...