Придумать, как перенаправить на другую страницу (на основе какого-либо параметра) после входа? - PullRequest
4 голосов
/ 23 марта 2012

В моем приложении у меня есть две разные формы входа в систему от двух контроллеров, которые оба будут входить в систему через Devise :: SessionsController, проблема в том, что после успешного входа (или сбоя) мне нужно перенаправить на разные страницы, которые относятся к контроллеру,Как я могу это сделать.В настоящее время у меня есть это в моем Devise :: SessionsController, который

class SessionsController < Devise::SessionsController
    def create
        resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#failure")
        return sign_in_and_redirect(resource_name, resource)
      end

      def sign_in_and_redirect(resource_or_scope, resource=nil)
        scope = Devise::Mapping.find_scope!(resource_or_scope)
        resource ||= resource_or_scope
        sign_in(scope, resource) unless warden.user(scope) == resource
        redirect_to dashboard_path
      end

      def failure      
        redirect_to index_path
      end
end

Ответы [ 3 ]

14 голосов
/ 23 марта 2012

В контроллере приложения

  before_filter :store_location
  def store_location
    unless params[:controller] == "devise/sessions"
      url = #calculate the url here based on a params[:token] which you passed in
      session[:user_return_to] = url
    end
  end

  def stored_location_for(resource_or_scope)
    session[:user_return_to] || super
  end

  def after_sign_in_path_for(resource)
    stored_location_for(resource) || root_path
  end
2 голосов
/ 12 декабря 2013

Если кто-то все еще ищет работу вокруг. Я смог решить это следующим образом:

Сначала создайте контроллер Sessions, унаследованный от Devise::SessionsController

class SessionsController < Devise::SessionsController

  def new
    get_pre_login_url(request.referer)
    super
  end

  def create
    @@referer_url
    super
  end

private

  def get_pre_login_url(url)
    @@referer_url = url
  end

  def after_sign_in_path_for(resource)
    # @@referer_url
    sign_in_url = url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http')
    if @@referer_url == sign_in_url
      super
    else
      stored_location_for(resource) || @@referer_url || root_path
    end
  end

end

Вы заметите, что я устанавливаю переменную класса (@@variable_name), которая мне не очень нравится, но это то, что я придумал после 4 часов, пытаясь найти другие способы решения этой проблемы. Я также стараюсь быть осторожным, чтобы не слишком сильно портить контроллер Devise и использовать super и только включать в себя те действия, которые меня волнуют.

Далее, в маршрутах вы можете указать значения по умолчанию Devise для контроллера выше. Вам не нужно это точно так, как показано ниже для devise_for, только часть, ссылающаяся на controllers: { sessions: "sessions" }

MyPortfolio::Application.routes.draw do

  devise_for :users, path_names: { sign_in: "login",
                                   sign_out: "logout" },
                    controllers: { omniauth_callbacks: "omniauth_callbacks",
                                   sessions: "sessions" }

  resources :posts do
    resources :comments
  end

  resources :projects do
    resources :comments
  end

  resources :users

  root :to => 'home#index'

  get 'login' => 'devise/sessions#new'
  get 'about_me' => 'about#index'
end

Возможно, это не самое СУЩЕСТВЕННОЕ решение, но это было единственное, что мне удалось придумать, чтобы указать перенаправление на страницу происхождения вместо корня или бесконечного цикла.

1 голос
/ 23 марта 2012

Вы можете сделать это, определив метод after_sign_in_path_for в вашем контроллере, где вы хотите настроить этот путь перенаправления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...