Как вы передаете параметры через fields_for? - PullRequest
0 голосов
/ 27 октября 2010

Я пытаюсь запустить это ..

- f.fields_for :referrals do |qf|

Но я бы тоже хотел это передать, @organization.referrals.select{|ref|ref.new_record?}. Это связано с тем, что передаваемые формы являются исключительно новыми объектами, а не более старыми.

Я пытался это сделать ..

- f.fields_for :referrals do |qf|
  - if qf.object.new_record?
    = render :partial => 'referral_fields', :locals => {:qf => qf}

Что делает его правильно отображаемым в представлении, но параметры все еще заполняются каждым ранее созданным вложенным объектом.

Это заставляет меня поверить, что мне нужно передать эту опцию внутри самого оператора fields_for.

Я также пробовал это:

- f.fields_for @organization.referrals.select{|ref|ref.new_record?} do |qf|
  = render :partial => 'referral_fields', :locals => {:qf => qf}

А также:

- f.fields_for :referrals, @organization.referrals.select{|ref|ref.new_record?} do |qf|
  = render :partial => 'referral_fields', :locals => {:qf => qf}

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

Второй отобразит и пропустит все вложенные объекты

Информация о приложении

#organization.rb
has_many  :referrals
accepts_nested_attributes_for :referrals, :reject_if => proc { |attributes| attributes.all? { |k, v| v.blank? } }, :allow_destroy => true
#referral.rb
belongs_to :organization
#referrals_controller.rb
def new
  2.times { @organization.referrals.build }
  ....
def create
  @referral = Referral.new(params[:referral])
  if @referral.valid? && @organization.referrals << @referral
    flash[:notice] = "Referrals saved."
    redirect_to new_organization_referrals_path(@organization)
  else
    render :action => :new, :layout => 'manage'
  end
end

1 Ответ

3 голосов
/ 27 октября 2010

Вот что вы хотите:

- f.fields_for :referrals, @organization.referrals.select{|ref|ref.new_record?} do |qf|
  = render :partial => 'referral_fields', :locals => {:qf => qf}

Первый параметр - это имя ассоциации, которое необходимо rails, чтобы знать, как структурировать параметры. Если вашим первым параметром является коллекция, rails обычно может вывести имя ассоциации из этой коллекции.

Однако ваша коллекция была отфильтрована в обычный массив, в котором связь не так легко вывести. Таким образом, вы передаете конкретную коллекцию в качестве второго параметра.

Удачи!

UPDATE

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

Мои модели:

# app/models/organization.rb
class Organization < ActiveRecord::Base
  has_many :referrals
  accepts_nested_attributes_for :referrals
end

# app/models/referral.rb
class Referral < ActiveRecord::Base
  belongs_to :organization
end

Действие редактирования моего контроллера:

# app/controllers/organizations_controller.rb
class OrganizationsController < ApplicationController
  def edit
    @organization = Organization.find(params[:id])
    2.times { @organization.referrals.build }
  end
end

Мои взгляды:

# app/views/organizations/edit.html.erb
<h1>Editing <%= @organization.name %></h1>

<% form_for(@organization) do |f| %>
  <%= f.error_messages %>

  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>

  <% f.fields_for :referrals, @organization.referrals.select{|ref| ref.new_record?} do |referral_fields| %>
    <%= render :partial => 'referral', :locals => {:f => referral_fields} %>
  <% end %>

  <p>
    <%= f.submit %>
  </p>
<% end %>

# app/views/organizations/_referral.html.erb
<p>
  <%= f.label :name, 'Referral Name' %><br />
  <%= f.text_field :name %>
</p>

Конечно, я только что прочитал ваши новые комментарии, и, возможно, вам это больше не нужно. Ну что ж, больше документации для потомков:)

...