2017-02-23 6 views
0

sign_inに使用されたparamsに基づいてユーザーをリダイレクトしたいのですが、方法がわかりません。 /users/sign_in/?demo=carsign_inパラメータに基づいてユーザーをリダイレクトする

ユーザー:: SessionsController <工夫:: SessionsController明らかにそれが動作しないでしょう

def create 
super 
# get the params 
if params[:demo] == car 
    # redirect_to where_ever 
end 
end 

からで

ユーザーがサイン。

正しいリダイレクト:

ApplicationControllerに< ActionController ::ベース

def after_sign_in_path_for(resource) 
# I must have params[:demo] here. How? 
if params[:demo] == car 
    # go elsewhere 
else 
    request.env['omniauth.origin'] || stored_location_for(resource) || root_path 
end 
end 

非常に長い道のりが、その後のparamsを持つユーザーの列を更新する場合とafter_sign_in_path_forに私がのためにcurrent_user列をチェックparamsは次にリダイレクトします。ユーザーが元のURLから来た場合は、列を""に更新します。時間の無駄、そう?

+0

あなたのログインフォームに隠し入力を追加し、 'のparamsでその値を埋めることができます[:デモ]'。フォームを送信した後(ログイン中)、値は 'params'からアクセスできます。 –

+0

私はまだユーザーがログインした後にそのparamsを持つ必要があります。私は私が欲しいことをするためにユーザーモデルを更新する必要があるかもしれないと思う。 – Sylar

+0

私はパラメータを 'after_sign_in_path_for'メソッドに転送する方法を提示しました。データベースに保存するか、セッションに保存することができます。あなたのケースによります;) –

答えて

-1

@redirを設定する前にアクションを実行します。あなたはbeetwenページがリダイレクト永続化する必要がある場合は、あなたのセッションで店舗

class ApplicationController < ActionController::Base 

    before_action :set_redir, if: -> { params[:redir].present? } 

    def set_redir 
    @redir = CGI.unescape(params[:redir]) 
    session[:redir] = @redir 
    end 

    def after_sign_in_path_for(resource) 
    session[:redir] || request.env['omniauth.origin'] || stored_location_for(resource) || root_path 
    end 

end 

セッション形式

<%= form_for(resource, :as => resource_name, :url => session_path(resource_name, redir: CGI.escape("http://someurl")), html: {role: 'form'}) do |f| %> 
0

は基本的に私は私の中に、工夫宝石、createからコードをコピーしなければなりませんでした。

def create 
    # Do not use super! 
    url = params[:redir] 
    self.resource = warden.authenticate!(auth_options) 

    if url 
    return # my destination 
    end 

    # Continue if no param 
    set_flash_message!(:notice, :signed_in) 
    sign_in(resource_name, resource) 
    yield resource if block_given? 
    respond_with resource, location: after_sign_in_path_for(resource) 

# Alternatively, I could have pass after_sign_in_path_for another param, url 
# then get it in ApplicationController < ActionController::Base 
end 

再生回数:

# /users/sessions/new.html.erb 
<%= form_for(resource, as: resource_name, url: session_path(resource_name, redir: params[:redirect_uri])) do |f| %> 
関連する問題