2014-03-19 50 views
4

我有一個Devise自定義問題,我正在努力。如何將查詢參數傳遞給Devise的登錄頁面

我們有一些查詢參數包含在某些電子郵件鏈接中,如果用戶在點擊鏈接時尚未通過身份驗證,那麼這些鏈接需要傳遞給登錄URL。例如,如果電子郵件中的鏈接是:

http://my.host.com/my/path/1234?x=y&foo=bar 

我想未授權的用戶重定向到

http://my.host.com/login/?foo=bar 

即一個特定的查詢參數需要傳遞 - 我不知道關心登錄表單上的任何其他人,但如果所有查詢參數都必須通過,我可以忍受這一點。

我已經找到了SO和Docs &來源於Devise和Warden,但是找不到一個直截了當的方法來做到這一點。道歉,如果我失去了明顯的東西。

+0

難道我的回答解決了問題? –

回答

3

最後,我們得到了我們想要的下降非常稍許不同的路線的影響。

與其將param包含在重定向到登錄的查詢URL中,我們能夠修改相關的代碼來接受會話參數。

然後,在application_controller.rb

class ApplicationController < ActionController::Base 
    before_filter :persist_login_param 
    ... 

    def persist_login_param 
    session[:foo] = params[:foo] 
    end 
end 

而在會話控制器,我們作用於會話參數的值,將其丟棄一次。

稍微凌亂,但它工作並獲取代碼現在推出到生產,這是重要的事情!

+0

我不認爲這適用於未經驗證的用戶。在'before_filter'有機會行動之前,Devise會將它們重定向到登錄頁面。至少這是我在Devise 2.0.4和Rails 2.2.2的設置中發現的。 – evanrmurphy

+0

沒關係,這確實有用!你只需要確保':persist_login_param'在'before_filter'鏈中的':authenticate_user!'之前。謝謝,斯科特。 – evanrmurphy

0

對於未認證用戶,以便通過具體PARAMS foo=barhttp://my.host.com/my/path/1234?x=y&foo=bar到您的登錄,執行如下:

假設上述電子郵件中的鏈接進入到行動myaction然後將下面的代碼添加到myaction

def myaction 
    if member_signed_in? 
     redirect_to root_path 
    else 
     ## If user is unauthenticated direct them to login page with specific params 
     redirect_to new_member_session_path(foo: params[:foo]) 
    end 
    end 

上述行動將通過PARAMS foo到色器件的登錄頁面,並在瀏覽器地址欄的實際鏈接看起來如下:

http://my.host.com/login?foo=bar ## Without/after login 

您可以通過重寫Devise :: SessionsController來訪問參數。例如:

class Users::SessionsController < Devise::SessionsController 
    ... 
    def new 
    @foo = params[:foo] 
    super 
    end 
    ... 
end 
+0

不幸的是,因爲認證發生在調用堆棧的更遠處,在這種情況下#myaction永遠不會被調用,除非用戶已經被認證。 –

0

可以使用,除非在before_action語句,那麼unauthentication用戶可以看到任何色器件控制器動作

class ApplicationController < ActionController::Base 
    ... 
    before_filter :sending_params 
    before_action :check_auth, unless: :devise_controller? 

    ... 

    protected 

    def check_auth 
    unless user_signed_in? 
     redirect_to new_user_session_path(sending_params) 
    end 
    end 

    def sending_params 
    params.permit(:first_param, :second_param) 
    end 
    ... 

,並且可以訪問到PARAMS不產生由生成設計的控制器設計的觀點和看法使用

<%= params[:first_param] %> 

如果需要將參數發送到omniauth控制器,您可以在設計視圖中更改鏈接

<%= link_to 'Sign in by provider', omniauth_authorize_path(:user, :provider, first_param: params['first_param']) %> 

其中:用戶 - 名色器件模型,:供應商 - 名omniauth提供商(:Facebook的即)

在omniauth控制器,你可以使用

def first_param 
    request.env['omniauth.params']['first_param'] ||= '' 
end