6

私がやりたいことは、ユーザーが確認リンクをクリックすると、アカウントが正常に確認されたときに、特定のロールが割り当てられている場合、指定されたパスにリダイレクトする必要があることです (ロールafter_createバックで正常に割り当てられます)。Userモデル)。

私は作成しましたRegistrationsController

class RegistrationsController < Devise::RegistrationsController
  protected

  def after_sign_up_path_for(resource)
    if resource.has_role? :seller
      new_item_path
    else
      root_path
    end
  end
end

しかし、これは常にroot_path....にリダイレクトされますが、ユーザーが実際にその役割を持っていることを確認しました。

編集 1

確認リクエストがに送信されないようですRegistrationsController

Started GET "/users/confirmation?confirmation_token=KRwZ7MChtxxq4sxxkDLq" for 127.0.0.1 at 2013-05-07 03:52:56 -0500
Processing by Devise::ConfirmationsController#show as HTML
  Parameters: {"confirmation_token"=>"KRwZ7MChtxxq4sxxkDLq"}
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."confirmation_token" = 'KRwZ7MChtxxq4sxxkDLq' LIMIT 1
   (0.1ms)  BEGIN
   (0.5ms)  UPDATE "users" SET "confirmation_token" = NULL, "confirmed_at" = '2013-05-07 08:52:56.846852', "updated_at" = '2013-05-07 08:52:56.847730' WHERE "users"."id" = 9
   (0.8ms)  COMMIT
   (0.1ms)  BEGIN
   (0.4ms)  UPDATE "users" SET "last_sign_in_at" = '2013-05-07 08:52:56.852250', "current_sign_in_at" = '2013-05-07 08:52:56.852250', "last_sign_in_ip" = '127.0.0.1', "current_sign_in_ip" = '127.0.0.1', "sign_in_count" = 1, "updated_at" = '2013-05-07 08:52:56.853180' WHERE "users"."id" = 9
   (0.7ms)  COMMIT
Redirected to http://localhost:3000/
Completed 302 Found in 31ms (ActiveRecord: 3.2

編集 2

これが私のroutes.rb見た目です

  devise_for :users, :path_names => { :sign_up => "register", 
                                      :sign_in => "login", 
                                      :sign_out => "logout",
                                      :settings => "settings" },
                      :controllers => { :registrations => "registrations" }

  devise_scope :user do
    get "login", :to => "devise/sessions#new"
    get "register", :to => "registrations#new"
        get "settings", :to => "devise/registrations#edit"
    get "logout",   :to => "devise/sessions#destroy"    
  end
4

3 に答える 3

16

私は最終的にそれを理解しました。

ConfirmationsController.rbDevise の Confirmation コントローラーをオーバーライドするクラスを作成する必要がありました。

class ConfirmationsController < Devise::ConfirmationsController
  protected
    def after_confirmation_path_for(resource_name, resource)
      if resource.has_role? :seller
        new_item_path
      else
        root_path
      end
    end
end

次に、私のroutes.rb

  devise_for :users, :path_names => { :sign_up => "register", 
                                      :sign_in => "login", 
                                      :sign_out => "logout",
                      :settings => "settings" },
                      :controllers => {:confirmations => "confirmations"}

  devise_scope :user do
    get "login", :to => "devise/sessions#new"
    get "register", :to => "devise/registrations#new"
    get "settings", :to => "devise/registrations#edit"
    get "logout",   :to => "devise/sessions#destroy"    
  end

それは私にとってはうまくいくようです。

于 2013-05-07T18:20:56.693 に答える
0

デフォルトの代わりにオーバーライドされたコントローラーを使用するようにデバイスに指示するために、次のように書いていますか?

config/routes.rb 内

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

于 2013-05-07T10:00:16.740 に答える