2017-02-23 5 views
0

Ich möchte einen Benutzer basierend auf einem Parameter umleiten, die sie verwendet, um sign_in, aber ich sehe keinen Weg zu.Benutzer umleiten basierend auf sign_in params

Benutzer Zeichen von /users/sign_in/?demo=car

Benutzer :: SessionsController < Devise :: SessionsController

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

Offensichtlich, dass nicht funktionieren würde.

Die korrekte Umleitung:

Application < Action :: Base

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 

Ein sehr langer Weg würde die Benutzer-Spalte mit den params dann in after_sign_in_path_for ich überprüfen Sie die current_user Spalte für die Aktualisierung Params dann umleiten. Wenn der Benutzer nur von der ursprünglichen URL kam, aktualisiere ich die Spalte auf "". Zeitverschwendung, oder?

+0

Sie können einen versteckten Eingang zu Ihrem Login-Formular hinzufügen und seinen Wert mit 'params füllen [: Demo]'. Nach dem Absenden des Formulars (Einloggen), wird der Wert von 'params' zugänglich sein. –

+0

Ich muss immer noch diese Parameter haben, nachdem der Benutzer angemeldet ist. Ich denke, ich muss das Benutzermodell aktualisieren, um zu tun, was ich will. – Sylar

+0

Ich habe die Methode vorgestellt, den Parameter in die Methode 'after_sign_in_path_for' weiterzuleiten. Sie können es dann in der Datenbank speichern oder in der Sitzung speichern. Es hängt von deinem Fall ab;) –

Antwort

-1

machen Sie eine vor Aktion, um ein @redir festzulegen. Wenn Sie anhalten beetwen Seite umleitet, Geschäft in Ihrer Sitzung

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 

Session Form

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

Im Grunde hatte ich den Code aus dem Devise Juwel zu kopieren, create, in meine.

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 

Aufrufe:

# /users/sessions/new.html.erb 
<%= form_for(resource, as: resource_name, url: session_path(resource_name, redir: params[:redirect_uri])) do |f| %> 
Verwandte Themen