Ruby on rails 如何使用Desive将用户与帐户关联?

Ruby on rails 如何使用Desive将用户与帐户关联?,ruby-on-rails,authentication,devise,Ruby On Rails,Authentication,Devise,我有一个名为“用户”的模型,我使用Desive创建帐户。当一些用户注册时,他被要求插入一封电子邮件和密码,之后我想将页面重定向到用户创建表单,用户将在其中插入更多详细信息,如姓名、年龄等。。。用户模型将有一个account_id字段,该字段将在创建时初始化为current_account.id。我想知道做这件事的最佳方法是什么。我希望Account类中有一个用户id,因此帐户属于用户,而不是相反。这是为了让协会更有意义,比如: models/user.rb models/account.rb 确

我有一个名为“用户”的模型,我使用Desive创建帐户。当一些用户注册时,他被要求插入一封电子邮件和密码,之后我想将页面重定向到用户创建表单,用户将在其中插入更多详细信息,如姓名、年龄等。。。用户模型将有一个account_id字段,该字段将在创建时初始化为current_account.id。我想知道做这件事的最佳方法是什么。

我希望Account类中有一个用户id,因此帐户属于用户,而不是相反。这是为了让协会更有意义,比如:

models/user.rb

models/account.rb

确保生成迁移以将用户id添加到account表

然后,您需要覆盖“设计注册”控制器。首先,我们编辑路由-您将看到我还包括:帐户作为嵌套资源(单数)。这样URL会更好,例如/users/6/account/edit

config/routes.rb

然后创建控制器。这里我们将覆盖两个方法,即“创建”操作,在其中我们将在其中构建用户帐户。然后要覆盖方法的after_sign_path_以重定向到编辑帐户页。**注:这适用于Desive 3.0.3。如果您使用的是不同的版本,请查看他们的github以获取注册代码

控制器/注册\u controller.rb

类注册控制器resource.id)#创建帐户的代码
如果resource.active\u用于\u身份验证?
设置flash消息:注意:如果是导航格式,则已注册?
注册(资源名称、资源)
使用资源响应:位置=>在为(资源)注册路径之后
其他的
设置flash消息:注意,如果是导航格式,“已注册但{resource.inactive{message}”?
登录后,会话数据过期!
使用资源响应:位置=>在不活动之后注册路径(资源)
结束
其他的
清除密码资源
用资源回应你
结束
结束
受保护的
#覆盖所需路线的注册后路径,例如
注册后的def路径(资源)
编辑用户帐户路径(resource.id)
结束
结束

我只是在本地玩了一下,有一些小错误和遗漏。我已经用测试过的代码更新了我的答案。
class User
  has_one :account
class Account
  belongs_to :user
devise_for :users, :controllers => {:registrations => "registrations"}

resources :users do 
  resource :account
end
class RegistrationsController < Devise::RegistrationsController

  def create
    build_resource(sign_up_params)

    if resource.save
      resource.build_account(:user_id => resource.id) # code to create account
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_navigational_format?
        sign_up(resource_name, resource)
        respond_with resource, :location => after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
        expire_session_data_after_sign_in!
        respond_with resource, :location => after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      respond_with resource
    end
  end

  protected

  # override the after signup path to your desired route, e.g
  def after_sign_up_path_for(resource)
    edit_user_account_path(resource.id)
  end
end