web-dev-qa-db-fra.com

Accept_nested_attributes_for fonctionne-t-il avec l'appartenance à?

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"
58
Nick M

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.

22
kid_drew

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.

21
robmclarty

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
10
user3551164

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

4
Fábio Araújo