2016-05-31 3 views
2

下記の状況について多くの読書を完了しました。いくつかの意見を欲しい。レールのデビーズ登録後にアカウントを作成するためにafter_actionを使用する

(1)のスレッドで、ユーザーは「登録フォームからDeviseユーザーを作成するときに別のオブジェクトを作成する方法は?」と尋ねます。これはまさに私がやろうとしていることです。ユーザーが登録すると、私はAccountオブジェクトを作成したい。

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

しかしまた、参照スレッドで浮上し、私が持ってきた問題が、あります。サブクラス化された登録コントローラーで以下を実行したとき。私は "属性を割り当てるとき、あなたは引数としてハッシュを渡す必要があります。" ArgumentsErrorはRegistrationsController#createにあります。

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


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

私はparamsハッシュにアクセスできないので、コールバックを使用しても機能しません。私はAccount.create(current_user)または(@user)の非常に多くのバリエーションを試しました。また、以下の別のdefを追加して、ユーザーID paramがaccountのuser_id外部キーに行くことを許可しようとしました。それでも同じエラー "属性を割り当てるときは、引数としてハッシュを渡す必要があります。"

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

ここで、(1)の質問が終了しました。 DeviseのRegistrationsControllerをバイパスすることを提案しました。

これは、ユーザーがDeviseに登録したときに他のモデルを作成する目的を達成する唯一の方法ですか?その他の提案はありますか?私は唯一の方法でなければ、登録コントローラをバイパスすることを約束したくありません。

他の情報を提供していただきありがとうございます。あなたのuser.rbファイルで

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 

答えて

1

、あなたがこれを行うことができます:

after_create :create_account 

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

を本当に迅速な回答グラハムに感謝!私は、あなたが表示するように、しかし、それは、RegistrationsControllerのメソッドを作成し、メソッドのエラーを与えているのuser.rbをセットアップしました。 RegistrationsController#でNoMethodErrorを作成し、#の 'account = 'メソッドを定義していません。これは、上記の "@ user.account = @account"行で特に発生します。私はRegistrationsControllerにcreateメソッドを追加して@accountを割り当てようとしましたが、アカウントのパラメータにアクセスできないため、元の問題に戻ります。何を指示してるんですか? – Jason

+0

これは、最後のユーザーが今作成されたレコードを参照することを100%保証しますか?クエリが実行される前に別のレコードを作成できますか? – Tashows

関連する問題