2011-12-19 67 views
1

有没有办法让我将URL传递到Devise登录页面,这样当用户登录时,他/她会被重定向回该URL?Rails Devise - 通过URL登录

喜欢的东西:

/login?passthru=/somethingawesome 

还是更设置会话变量?

回答

1

具有存储重定向位置的方法和访问application_controller所存储的重新导向位置的方法:

def store_location(path) 
    session[:return_to] = request.request_uri || path 
end 

def redirect_back_or_default(default) 
    redirect_to(session[:return_to] || default) 
    session[:return_to] = nil 
end 

覆盖的after_sign_in_path_for方法将用户重定向到所需的位置:

def after_sign_in_path_for(resource_or_scope) 
    redirect_back_or_default(resource_or_scope) 
end 

Devise Wiki:如何:Redirect to a specific page on successful sign in out

顺便说一下,上述方法未经测试,您应该测试它。

+0

大,感谢您的回答.. – slotishtype 2011-12-19 09:37:39

1

这里就是我所做的

1)在你的模板设置您的sign_in登录 如下:IM request.fullpath路过这里,你可以用任何你想要替换这样的一个例子。

<%= link_to "Log in", new_user_session_path(:passthru => request.fullpath %> 

2)然后修改的ApplicationController如下:我们添加的before_filter如果存在这台中继的会话。然后我们重写after_sign_in_path_for以查看会话中的passthru。如果不存在,它将默认为root_path。只要你在任何地方始终使用参数处理登录,这应该可以工作。虽然它可能需要一些调整。

before_filter :store_location 

def store_location 
    session[:passthru] = params[:passthru] if params[:passthru] 
end 

def redirect_back_or_default(default) 
    session[:passthru] || root_path 
end 

def after_sign_in_path_for(resource_or_scope) 
    redirect_back_or_default(resource_or_scope) 
end 
0

更新有新版本(2.2.0红宝石,Rails的4.2.0,3.2.4设计):

Application_Controller.rb

before_action :store_location 

    private 

    def store_location 
    session[:requestUri] = params[:requestUri] if params[:requestUri].present? 
    end 

设计Sessions_Controller.rb

# Custom After Sign in Path 
    def after_sign_in_path_for(resource_name) 
    if session[:requestUri] 
     session.delete(:requestUri) 
    else 
     super 
    end 
    end 

查看xxxx.html.erb

<%= link_to ('Get This'), some_require_auth_path(@something.id, requestUri: request.fullpath), class: 'button' %>