2010-10-27 42 views
0

我试图运行这个..你如何通过fields_for传递选项?

- 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 

回答

3

这里有你想要的东西:

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

第一个参数是该协会的名称,轨道需要知道如何构造参数。如果您的第一个参数是一个集合,那么rails通常可以从该集合中推断出关联名称。

但是,您的收藏集已被过滤为常规数组,其中关联不易推断。所以你把特定的集合作为第二个参数。

祝你好运!

UPDATE

我已经建立了一个小的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> 

当然,我刚刚看了你新的评论,也许你并不需要这个了。哦,更多的文档为后人:)

+0

不行不行。这显示并将所有嵌套对象传递给params。 – Trip 2010-10-27 14:30:41

+0

但是,非常感谢你;) – Trip 2010-10-27 14:45:16

+0

你使用的是什么版本的rails? – 2010-10-27 14:50:10

相关问题