J'ai reçu toutes sortes d'informations contradictoires concernant cette question fondamentale, et la réponse est assez cruciale pour mes problèmes actuels. Donc, très simplement, dans Rails 3, est-il autorisé ou non d'utiliser accept_nested_attributes_for avec une relation d'appartenance?
class User < ActiveRecord::Base
belongs_to :organization
accepts_nested_attributes_for :organization
end
class Organization < ActiveRecord::Base
has_many :users
end
En vue:
= form_for @user do |f|
f.label :name, "Name"
f.input :name
= f.fields_for :organization do |o|
o.label :city, "City"
o.input :city
f.submit "Submit"
Les attributs imbriqués semblent fonctionner correctement pour une association appartenir à Rails 4. Il a peut-être été modifié dans une version antérieure de Rails, mais j'ai testé dans 4.0.4 et cela fonctionne définitivement comme prévu.
Le document epochwolf a cité les états de la première ligne "Les attributs imbriqués vous permettent d'enregistrer des attributs sur les enregistrements associés via le parent ". (c'est moi qui souligne).
Vous pourriez être intéressé par cette autre SO question qui va dans le même sens que celle-ci . Elle décrit deux solutions possibles: 1) déplacer les accept_nested_attributes de l'autre côté de la relation (dans ce cas, Organisation), ou 2) en utilisant la méthode build
pour créer l'organisation dans l'utilisateur avant de rendre le formulaire.
J'ai également trouvé un Gist qui décrit ne solution potentielle pour utiliser accept_nested_attributes avec une relation d'appartenance si vous êtes prêt à traiter avec un peu de code supplémentaire. Cela utilise également la méthode build
.
Pour belongs_to
association dans Rails 3.2, le modèle imbriqué nécessite les deux étapes suivantes:
(1) Ajouter un nouveau attr_accessible
à votre modèle enfant (modèle utilisateur).
accepts_nested_attributes_for :organization
attr_accessible :organization_attributes
(2) Ajoutez @user.build_organization
à votre contrôleur enfant (contrôleur utilisateur) afin de créer la colonne organization
.
def new
@user = User.new
@user.build_organization
end
Pour Ruby on Rails 5.2.1
class User < ActiveRecord::Base
belongs_to :organization
accepts_nested_attributes_for :organization
end
class Organization < ActiveRecord::Base
has_many :users
end
Je viens d'arriver sur votre contrôleur, supposons être "users_controller.rb":
Class UsersController < ApplicationController
def new
@user = User.new
@user.build_organization
end
end
Et la vue comme Nick l'a fait:
= form_for @user do |f|
f.label :name, "Name"
f.input :name
= f.fields_for :organization do |o|
o.label :city, "City"
o.input :city
f.submit "Submit"
À la fin, nous voyons que @ user3551164 a déjà résolu, mais maintenant (Ruby on Rails 5.2.1) nous n'avons pas besoin du attr_accessible :organization_attributes