Разработать - перенаправить пользователю, который щелкнул после входа в систему, если пользователь не вошел в систему - PullRequest
2 голосов
/ 16 марта 2012

Я использую Devise в Rails 3. Я использовал before_filter :authenticate_user! для перенаправления для входа, если пользователь, не вошедший в систему, нажимает на ссылку.Это работает, но после входа в систему он перенаправляет обратно на домашнюю страницу.Вместо этого я хочу перенаправить на ссылку, которую пользователь щелкнул перед перенаправлением на страницу входаЭто мой код:

application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :authenticate_user!
  layout :layout_by_resource

  def after_sign_in_path_for(resource_or_scope)
    if resource_or_scope.is_a?(User)
      if current_user.admin?
        admin_event_types_path
      else
        home_path
      end
    else
      super
    end
  end
  ..
  ..
end

user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, 
         :token_authenticatable
  ..
  ..
end

Обновление

Я пробовал это, используя ответ от @dreamfall, но он не перенаправляет, как ожидалось.

def after_sign_in_path_for(resource_or_scope)
  if resource_or_scope.is_a?(User)
    if current_user.admin?
      stored_location_for(resource_or_scope) ? stored_location_for(resource_or_scope) : admin_event_types_path 
    else
      stored_location_for(resource_or_scope) ? stored_location_for(resource_or_scope) : home_path
    end
  else
    super
  end
end

Есть ли какая-либо встроенная конфигурация для этого в Devise?Если нет, как мне это сделать и где я должен изменить код?

Ответы [ 2 ]

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

Devise предоставляет функциональность для перенаправления на сохраненный в сеансе URL после входа в систему. Используйте метод stored_location_for(resource_or_scope) в вашем методе after_sign_in_path_for(resource_or_scope).

0 голосов
/ 31 июля 2017

У меня была та же проблема, и я решил ее следующим образом:

before_action :store_location

  def after_sign_in_path_for(*)
    session[:previous_url] || root_path
  end

  private

  def store_location
    # store last url - this is needed for post-login redirect to 
    whatever the user last visited.
    return unless request.get?
    if (request.path != "/users/sign_in" &&
        request.path != "/users/sign_up" &&
        request.path != "/users/password/new" &&
        request.path != "/users/password/edit" &&
        request.path != "/users/confirmation" &&
        request.path != "/users/sign_out" &&
        !request.xhr?) # don't store ajax calls
      session[:previous_url] = request.fullpath
    end
  end

Это в основном перехват всех запросов get и сохранение URL-адреса в сеансе пользователя.После входа в систему, если у вас сохранен предыдущий_урл, он будет перенаправлен правильно.

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