2010-10-27 77 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

相關問題