使用after_action创建帐户后,设计登记轨道

问题描述:

对以下情况做了大量的阅读。想要一些意见。使用after_action创建帐户后,设计登记轨道

在(1)的线程中,用户询问“如何在从Rails中的注册表单创建Devise User时创建另一个对象?”。这正是我想要做的。当用户注册时,我想创建一个Account对象。

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

不过有我一直有一个问题,这也浮出水面,在被引用的线程。当我在我的子类注册控制器中运行以下内容时。我得到“当分配属性时,你必须通过散列作为参数。” RegistrationsController#create中的ArgumentError。

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参数转到Account的user_id外键。仍然是同样的错误“当分配属性时,你必须传递一个散列作为参数。”

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

这是(1)处的问题结束的地方。它建议绕过Devise的RegistrationsController。

这是实现在用户注册Devise时创建其他模型的唯一剩余方法吗?还有其他建议吗?我不想承诺绕过注册控制器,除非它是唯一的方法。

感谢您的任何建议,并乐意提供任何其他信息。

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 

在你user.rb文件,你可以这样做:

after_create :create_account 

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

真正体会到快速回复格雷厄姆!我已经设置了user.rb,但是它调用了RegistrationsController中的create方法,并且没有提供方法错误。注册控制器中的NoMethodError#create,然后未定义的方法'account ='for#。这是在上面显示的“@ user.account = @account”行上特别提出的。我尝试将create方法添加到RegistrationsController并分配@account,但后来我又回到了原始问题,因为我无法访问帐户参数。你有什么建议? – Jason

+0

这是否100%保证最后一位用户会引用刚创建的记录?在查询运行之前可以创建另一条记录吗? – Tashows