在用户确认帐户后覆盖重定向路径 - Devise

7
我希望发生的情况是,一旦用户单击确认链接,并成功确认他们的账户,如果他们有特定的角色分配(在User模型上的after_create回调中已成功分配),则应将他们重定向到某个指定路径。
我创建了一个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

资源是否等于用户? - ahmet
我相信是这样的。这就是devise使用的方式。 - marcamillion
3个回答

17

最终我想通了。

我不得不创建一个ConfirmationsController.rb类,覆盖Devise的确认控制器。

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

对我来说,那似乎很好用。


0
你在 model user.rb 中写了 role 方法吗?如果没有,你应该写一个 role 方法。
或者,在 User 类的 user.rb 中顶部写上 rolify

是的,我已经验证了该用户确实拥有该角色。 - marcamillion

0
你是否已经编写了以下内容,以告诉Devise使用重写的控制器而不是默认控制器?
在config/routes.rb中: devise_for :users, :controllers => {:registrations => "registrations"}

是的。我已经更新了我的routes.rb文件。 - marcamillion
在注册控制器中编写load_and_authorize_resource。 - Murhari
您可以参考http://stackoverflow.com/questions/7624385/custom-registrations-controller-for-devise-not-overriding-create-action。 - Murhari
这会抛出一个错误 - 未初始化的常量Register。此外,它与Devise自己的建议相反:https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-up-(registration)。 - marcamillion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接