2017-02-23 85 views
0

Я хочу перенаправить пользователя на основе параметров, которые они использовали для sign_in, но я не вижу способа. знакиПеренаправить пользователя на основе параметров sign_in

пользователя в /users/sign_in/?demo=car из

Пользователи :: SessionsController < Разрабатывают :: SessionsController

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

Очевидно, что не будет работать.

Правильный редирект:

ApplicationController < ActionController :: 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 

очень длинный путь будет обновить столбец пользователя с Params, то в after_sign_in_path_for я проверить current_user колонку для params затем перенаправляют. Если пользователь пришел только из исходного URL-адреса, я обновляю столбец до "". Отходы времени, не так ли?

+0

Вы можете добавить скрытый вход в форму авторизации и заполнить его значение с 'Params [: демонстрационными]'. После отправки формы (входа в систему) значение будет доступно из 'params'. –

+0

Мне все еще нужно иметь эти параметры после входа пользователя. Думаю, мне может понадобиться обновить модель пользователя, чтобы делать то, что я хочу. – 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| %>