2

登録にDeviseを使用するRailsアプリに取り組んでいます。これと同様に、ユーザーロールの管理に単一テーブル継承を使用します。3つのユーザーモデル、、User < ActiveRecordAdmin < UserありCollaborator < 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

また、使用するヘルパーメソッドをいくつか作成しました(と同じ)

# 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 に答える