如何使用设计将用户与帐户相关联?

时间:2014-11-09 21:32:17

标签: ruby-on-rails authentication devise

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

1 个答案:

答案 0 :(得分:2)

我在Account类中有一个user_id,因此一个帐户属于一个用户,而不是相反。这对于协会更有意义,如下:

模型/ user.rb

class User
  has_one :account

模型/ account.rb

class Account
  belongs_to :user

确保您生成用于将user_id添加到帐户表的迁移!!

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

配置/ routes.rb中

devise_for :users, :controllers => {:registrations => "registrations"}

resources :users do 
  resource :account
end

然后创建控制器。我们将在此处覆盖两种方法,即'创建'动作,我们将在其中构建用户帐户。然后想要覆盖after_sign_up_path_for方法以重定向到编辑帐户页面。 **注意:这是针对设计3.0.3。如果您使用的是其他版本,请查看他们的github以获取注册码。

控制器/ registrations_controller.rb

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