Spree redirect after login

梦想的初衷 提交于 2019-12-24 03:16:13

问题


Spree 2.3 with spree_auth_devise, Rails 4.0

I am trying to redirect users after sign in based on their role. The best solution would be to modify a path, a la Devise, in an initializer, but these don't seem to exist for Spree. The next best solution would be to create a decorator on the sessions controller, but I can't find this controller, nor can I access it when I attempt to follow the information from rake routes

How can I redirect users to a new location after login, in a Spree app, based on their role?

UPDATE Overwriting the after_sign_in_path_for(resource) method results in the method being triggered, but still rerouting to the admin_path.

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  def after_sign_in_path_for(resource)
    byebug # this is triggered
    root_path
  end
end

### OR ####

class ApplicationController < ActionController::Base
  def after_sign_in_path_for(resource)
    byebug # this is triggered
    if spree_current_user.has_spree_role?("admin")
      admin_path
    elsif spree_current_user.has_spree_role?("designer")
      new_designers_spree_variant_path
    else
      root_path
    end
  end
end

My attempts are being documented here: https://gist.github.com/asteel1981/0f258260974f4d748fb5

Thanks in advance.


回答1:


Thanks to @mvidaurre for spending some time with me drilling down into this.

The issue is that spree_auth_devise has a second method that attempts to reroute to the last page attempted, meaning I needed to modify not only the after_sign_in_path_for method, but the Spree method redirect_back_or_default(default).

Additionally, because my user signs in through the admin/sign_in route, I needed to access the Spree::Admin::UserSessionsController instead of simply the Spree::UserSessionsController.

My early solution looks like this:

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  def after_sign_in_path_for(resource)
    if spree_current_user.has_spree_role?("admin")
      admin_path
    elsif spree_current_user.has_spree_role?("designer")
      '/designers/spree_variants/new' #rails helper gives the wrong path, not sure why
    else
      root_path
    end
  end
end

# app/controllers/spree/admin/user_sessions_controller.rb
Spree::Admin::UserSessionsController.class_eval do
  def redirect_back_or_default(default)
    if spree_current_user && spree_current_user.has_spree_role?("admin")
      redirect_to(session["spree_user_return_to"] || default)
      session["spree_user_return_to"] = nil
    else
      redirect_to(default)
    end
  end
end

The relevant spree source code is here: https://github.com/spree/spree_auth_devise/blob/8cb2d325b2c1da02cbe137404d8dda89cc1613a2/lib/controllers/backend/spree/admin/user_sessions_controller.rb




回答2:


Thanks for your answer in the comments. spree_auth_devise defines the Spree::UserSessionsController you can decorate the controller and use the method described in: How To: redirect to a specific page on successful sign in

You can implement your custom method for:

def after_sign_in_path_for(resource)
  current_user_path
end

Maybe something like this:

def after_sign_in_path_for(resource)
  if spree_current_user.has_spree_role?("designer")
    root_path
  elsif spree_current_user.has_spree_role?("admin")
    admin_path
  else
    root_path
  end
end



回答3:


Spree documentation seems to cover this, check out:

http://guides.spreecommerce.com/developer/authentication.html

It seems to be a good starting point for what you're trying to achieve.



来源:https://stackoverflow.com/questions/25166899/spree-redirect-after-login

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!