2010-03-09 2 views
33

Un moyen d'accéder à un objet imbriqué form_bulder.object?fields_for l'objet du générateur de formulaire est nul

## controller 
@project = Project.new 
@project.tasks.build 

form_for(@project) do |f| 
    f.object.nil? ## returns false 

    fields_for :tasks do |builder| 
    builder.object.nil? ## returns true 
    end 
end 

Répondre

59

Vous devez avoir accept_nested_attributes_for dans le modèle Project pour que l'objet soit transmis.

class Project < ActiveRecord::Base 
    has_many :tasks 
    accepts_nested_attributes_for :tasks ## this is required 
end 
+1

Vous m'avez sauvé la vie .. merci! – asiniy

+0

Banged ma tête sur cela pendant environ 90 minutes. Ouf. – DanSingerman

+0

Environ tous les 6 mois j'oublie d'ajouter ceci, tellement ennuyeux qu'il n'y a aucune erreur sensible pour ceci. Mais je suppose que cela pourrait être difficile à détecter automatiquement. –

11

fields_for exige que la méthode tasks_attributes= existe. accepts_nested_attributes_for :tasks crée cette méthode pour vous, mais vous pouvez aussi simplement définir vous-même:

def tasks_attributes=(params) 
    # ... manually apply attributes in params to tasks 
end 

Lorsque cette méthode n'existe pas, le builder.object finit par être nul.

+0

Merci qui était vraiment utile – mrageh