2016-05-31 1 views
2

Fait beaucoup de lecture sur la situation ci-dessous. Vous voulez des opinions.Utiliser after_action pour créer un compte après un enregistrement Devise pour les rails

Dans le fil de discussion (1), l'utilisateur demande "Comment créer un autre objet lors de la création d'un utilisateur Devise à partir de son formulaire d'inscription dans Rails?". C'est exactement ce que j'essaie de faire aussi. Lorsqu'un utilisateur s'inscrit, je souhaite créer un objet Compte.

(1) How to create another object when creating a Devise User from their registration form in Rails?

Cependant, il y a un problème que j'ai eu, qui a fait surface aussi au fil de référence. Lorsque je lance ce qui suit dans mon contrôleur d'enregistrements sous-classé. Je reçois "Lors de l'attribution des attributs, vous devez passer un hachage comme argument." ArgumentError dans RegistrationsController # create.

class RegistrationsController < Devise::RegistrationsController 
    after_action :create_account, only: [:create, :update] 


    private 
    def create_account 
     Account.create(@user) 
    end 
end 

Il se trouve que l'utilisation callbacks ne fonctionnent pas parce que je n'ai pas accès au hachage params. J'ai essayé tellement de différentes variantes de Account.create (current_user) ou (@user) ainsi que d'ajouter une autre définition ci-dessous pour essayer d'autoriser l'utilisateur à entrer dans la clé étrangère user_id de Account. Toujours la même erreur "Lors de l'attribution d'attributs, vous devez passer un hachage en tant qu'argument."

def account_params 
    params.require(:account).permit(:user_id,:user) 
end 

C'est où la question à (1) fini. Il a proposé de contourner RegistrationsController de Devise.

Est-ce la seule façon restante d'atteindre l'objectif de créer d'autres modèles lorsqu'un utilisateur s'enregistre dans Devise? D'autres suggestions? Je ne veux pas m'engager à contourner le contrôleur des enregistrements sauf si c'est le seul moyen.

Merci pour toute suggestion et heureux de fournir toute autre information.

class Account < ApplicationRecord 
    has_many :users 
end 

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    has_many :projects 
    has_many :notes 
    belongs_to :account 

Répondre

1

Dans votre fichier user.rb, vous pouvez le faire:

after_create :create_account 

def create_account 
    @user = User.last 
    @account = Account.new 
    @user.account = @account 
    @user.save 
    @account.save 
end 
+0

apprécient vraiment la réponse rapide Graham! J'ai installé le user.rb comme vous montrez cependant qu'il appelle la méthode create dans RegistrationsController et ne donne aucune erreur de méthode. NoMethodError dans RegistrationsController # create puis une méthode non définie 'account = 'pour # . Ceci est spécifiquement soulevé sur la ligne "@ user.account = @account" montrée ci-dessus. J'ai essayé d'ajouter la méthode create à RegistrationsController et d'attribuer @account, mais je suis revenu au problème d'origine, car je ne peux pas accéder aux paramètres du compte. Que suggérez-vous? – Jason

+0

Est-ce que cela garantit 100% que le dernier utilisateur va se référer à l'enregistrement qui vient d'être créé? Un autre enregistrement peut-il être créé avant que cette requête ne soit exécutée? – Tashows