你如何通过fields_for传递选项?

时间:2010-10-27 13:54:53

标签: ruby-on-rails forms nested-forms

我正试图运行这个..

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

这使得它在视图中正确显示,但是params仍然填充了每个先前创建的嵌套对象。

这让我相信我需要在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 个答案:

答案 0 :(得分:3)

这是你想要的:

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

第一个参数是关联名称,rails需要知道如何构造params。如果您的第一个参数是集合,则rails通常可以推断该集合中的关联名称。

然而,您的集合已被过滤为常规数组,其中无法轻易推断出关联。因此,您将特定集合作为第二个参数传递。

祝你好运!

<强>更新

我已经构建了一个小型rails应用程序来分析问题,上面的解决方案对我来说效果很好 - 编辑表单不显示现有的推荐,只显示新推荐。我将发布相关代码,以便我们可以看到您和我可能会有所不同。有一点需要注意,这一切都在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>

当然,我刚看了你的新评论,也许你不再需要了。哦,更多的后代文档:)