2010-10-27 4 views
0

Je suis en train de courir ce ..Comment passez-vous les options via fields_for?

- f.fields_for :referrals do |qf| 

Mais je voudrais passer cela, @organization.referrals.select{|ref|ref.new_record?} aussi bien. C'est ainsi que les formes passées sont exclusivement de nouveaux objets, et non plus anciens.

J'ai essayé de le faire ..

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

ce qui en fait afficher correctement dans la vue, mais les params sont encore peuplées avec chaque objet imbriqué précédemment créé.

Ce qui me porte à croire que j'ai besoin de passer cette option dans l'instruction fields_for elle-même.

J'ai aussi essayé:

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

Outre ceci:

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

Le premier exemple montrera et ne permet de passer un objet. Où que mon formulaire est de permettre un nombre dynamique de formulaires imbriqués en double.

La deuxième affiche et passer tous les objets imbriqués

App Infos

#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 

Répondre

3

Voici ce que vous voulez:

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

Le premier paramètre est le nom de l'association, qui rails besoins afin de savoir comment structurer les params. Si votre premier paramètre est une collection, les rails peuvent généralement déduire le nom de l'association de cette collection.

Votre collection a cependant été filtrée dans un tableau régulier, où l'association ne peut pas être aussi facilement déduite. Donc vous passez la collection spécifique comme deuxième paramètre.

Bonne chance!

MISE À JOUR

J'ai construit une petite application rails pour analyser le problème et la solution ci-dessus fonctionne très bien pour moi - le formulaire de modification ne présente pas des références existantes, que de nouveaux. Je posterai le code pertinent, afin que nous puissions voir où vous et moi pourrions différer.Une mise en garde, tout cela est dans erb depuis que je travaille rarement avec haml et ne voudrais pas une faute de frappe gâcher la solution :)

Mes modèles:

# 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 

action d'édition de mon contrôleur:

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

Mes vues:

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

Bien sûr, je viens de lire vos nouveaux commentaires, et peut-être vous ne pas besoin ça plus. Eh bien, plus de documentation pour la postérité :)

+0

Non ne fonctionnera pas. Cela montre et passe tous les objets imbriqués aux params. – Trip

+0

Mais merci nonethless;) – Trip

+0

quelle version de rails utilisez-vous? –

Questions connexes