2016-07-27 1 views
3

J'utilise Rails 4.2.7. Dans mon modèle, j'aiEn RoR, f.fields_for est rendu comme rien

class MyObject < ActiveRecord::Base 
    … 
    belongs_to :address, :autosave => true, dependent: :destroy 

    accepts_nested_attributes_for :address, :my_object_times 

et le modèle d'adresse

class Address < ActiveRecord::Base 
    belongs_to :state 
    belongs_to :country 
    ... 
    has_one :my_object 

end 

Je veux écrire une forme qui me permettra de construire à la fois les objets enfants et parents, alors j'ai essayé

<%= form_for @my_object, :url => my_objects_create_path, :remote => true do |f| %> 

    <div class="field"> 
    <%= f.fields_for :address do |addr| %> 
    <%= addr.label :address %> <span name="my_object[address]_errors"></span><br> 
    City: <%= addr.text_field :city %> 
    <%= addr.select :state, options_for_select(us_states.collect{|s| [ s.name, s.id ]}), {:prompt => "Select State"} %> 
    <%= country_code_select('my_object[address]', 'country_id', 
       [[ 'US', 'United States' ], [ 'CA', 'Canada' ]], 
       {:include_blank=>true, :selected => @default_country_selected.id}, 
       {:class=>'countryField'} 
      ) %> 
    <% end %> 
    </div> 

mais ce qui précède est rendu comme seul

<div class="field"> 
</div> 

Comment puis-je régler les choses pour que mes champs rendent et je suis en mesure de créer mon objet dans mon contrôleur en utilisant

my_object = MyObject.new(params) 

Edit: par la réponse donnée, j'ai essayé

@my_object.address.build 

de Teh action du contrôleur taht rendres la forme, mais a obtenu le erorr

undefined method `build' for nil:NilClass 

Répondre

1

#Ceci est sous forme de classe de chargement

def new 
    @myobject = MyObject.new 
    @myobject.address = Address.new 
end 

#Now vous pouvez utiliser l'attribut imbriqué pour adresse

<%=form_for(@myobject) do |f|%> 
<%=f.fields_for :address do |a|%> 
    Your form fields here 
    <%end%> 
<%end%> 

#Ceci est de créer def

def create 
@myobject = MyObject.new(myobject_params) 
@myobject.save 
end 

#in params

def myobject_params 
params.require(:myobject).permit(:some, :key,:of, :myobject, :address_attributes[:address, :attribute]) 
end 

#Ceci devraient travailler

+0

J'ai l'erreur "méthode non définie' new 'pour néant: NilClass "sur la ligne" @ myobject.address.new " – Dave

+0

La réponse a été mise à jour pour vous. –

1

Si my_object n'a aucune adresse, aucune chose sera rendue. C'est le comportement par défaut dans Rails. Une façon de se déplacer est de construire un ou plusieurs vides enfants dans le contrôleur de sorte qu'au moins un ensemble de champs est affiché à l'utilisateur

Les rails guides parlent à ce sujet dans Nested section Formulaires 9.2

également , dans votre modèle MyObject, je pense qu'il devrait être has_one address. vous avez belongs_to

class MyObject < ActiveRecord::Base 
    has_one :address, :autosave => true, dependent: :destroy 
    accepts_nested_attributes_for :address 
end 
+0

Ma table "my_objects" a une colonne "ADDRESS_ID" qui relie à la table "adresses". Étant donné que, dites-vous toujours que la relation devrait être "has_ *" à la place ob "belongs_to"? – Dave

+0

Désolé de ne pas savoir à quoi 'my_object' fait référence, je ne peux pas dire comment vous devriez structurer vos assocations de données. La raison pour laquelle '@ my_object.address.build' donne cette erreur est parce qu'avec l'association' has_many' le constructeur devrait être '@ my_object.addresses.build'. Ou il pourrait être 'has_one'. Dans tous les cas, avec un formulaire imbriqué, il est logique que l'objet enfant appartienne à l'objet parent.Je ne suis pas sûr si vous pouvez le faire fonctionner de l'autre côté - que je ne sais pas honnêtement – Ren

+0

dans tous les cas peut-être essayer d'avoir un objet instance 'address' vide dans votre contrôleur my_object dans la nouvelle action pour obtenir le formulaire rendre. Voir si cela aide – Ren