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.rb覆盖 Devise 的 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

您是否在模型 user.rb 中编写了角色方法。如果不是,您应该编写角色方法

或者

rolify您可以在顶部的 User 类中写入user.rb

于 2013-05-07T09:46:47.760 回答
0

您是否编写了以下内容来告诉设计使用覆盖控制器而不是默认控制器

在 config/routes.rb

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

于 2013-05-07T10:00:16.740 回答