2

我正在开发一个使用 Devise 进行注册的 Rails 应用程序。我使用单表继承来管理用户角色,类似于 this。我有三个用户模型User < ActiveRecordAdmin < UserCollaborator < User。协作者和管理员共享会话。我目前的问题是创建新用户,用户被保存到数据库和 user_signed_in?返回 true,但 current_user 由于某种原因返回 nil。

当用户创建他们的帐户时,它应该重定向到我的 AccountsController 索引操作,如下所示:

def index
  @accounts = current_user.accounts
end 

结果是:

undefined method `accounts' for nil:NilClass

当我尝试登录时,相同的代码有效。

我的路线看起来像这样(截至)

devise_for :users, :controllers => {:sessions  => 'sessions'}, :skip => [:registrations] do
  delete '/logout', :to => 'sessions#destroy', :as => :destroy_user_session
  get '/sign_in', :to => 'sessions#new', :as => :new_user_session
  post '/sign_in', :to => 'sessions#create', :as => :user_session
end
devise_for :admins, :controllers => {:registrations  => 'admins/registrations'}, :skip => :sessions do
  get '/sign_up', :to => 'admins/registrations#new', :as => :new_admin
  post '/sign_up', :to => 'admins/registrations#create', :as => :admin
end
devise_for :collaborators, :controllers => {:registrations  => 'collaborators/registrations'}, :skip => :sessions

我还创建了一些我使用的辅助方法(与 of 相同)

# New Version using dynamic methods
  %w(Collaborator Admin).each do |k|
  define_method "current_#{k.underscore}" do
    current_user if current_user.is_a?(k.constantize)
  end

  define_method "authenticate_#{k.underscore}!" do |opts={}|
    send("current_#{k.underscore}") || not_authorized
  end
end

def after_sign_in_path_for(resource)
  if resource.is_a?(User)
    accounts_path
  else
    super
  end
end

def after_sign_up_path_for(resource)
  accounts_path
end

有谁知道是什么原因造成的?

4

1 回答 1

0

我设法通过自定义 after_sign_up_path_for 来解决它,如下所示:

def after_sign_up_path_for(resource)
  sign_in(resource)
  accounts_path 
end

让我知道是否有更好的方法来做到这一点。

于 2012-04-28T21:11:41.893 回答