2013-05-07 45 views
5

我想要发生的事情是,用户单击确认链接并成功确认其帐户后,它们应该被重定向到某个指定路径(如果它们具有特定角色(在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 "https://stackoverflow.com/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 
+0

资源是否等于用户 – ahmet 2013-05-07 09:36:47

+0

我相信如此。这就是设计的用途。 – marcamillion 2013-05-07 09:46:55

回答

16

我事件ually想通了。

我必须创建一个覆盖Devise的确认控制器的ConfirmationsController.rb类。

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

感谢兄弟,它真的很有帮助 – 2014-02-12 12:39:47

0

您是否在模型user.rb中编写了角色方法?如果没有,你应该写作用的方法

OR

您可以在User类user.rb顶部

+0

是的。我已经验证用户确实有这个角色。 – marcamillion 2013-05-07 09:47:23

0

rolify你有写过下面告诉设计使用,而不是默认

重写控制器

在配置/ routes.rb中

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

+0

是的。用我的routes.rb更新了这个问题。 – marcamillion 2013-05-07 10:13:12

+0

在注册控制器写load_and_authorize_resource – Murhari 2013-05-07 10:27:31

+0

您可以参考http://stackoverflow.com/questions/7624385/custom-registrations-controller-for-devise-not-overriding-create-action – Murhari 2013-05-07 10:31:33