Сессия [: user_return_to] получает ноль при перенаправлении обратно на текущую страницу после входа - PullRequest
0 голосов
/ 11 мая 2018

Я хочу перенаправить обратно на текущую страницу после входа. У меня уже есть устройство в моем приложении rails. Я следовал этому уроку устройства https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update#storelocation-to-the-rescue.

В чем проблема после реализации, объяснено ниже: Я ввожу URL-адрес напрямую, не входя в систему / tasks / 1, и в этот момент этот URL-адрес сохраняется в сеансе [: user_return_to] затем я перенаправлен в / users / sign_in, и в этот момент значение в сеансе [: user_return_to] получает nil, из-за этого я не могу перенаправить на предыдущую страницу после входа в приложение.

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  before_action :store_user_location!, if: :storable_location?
  before_action :authenticate_user!
  before_filter :configure_permitted_parameters, if: :devise_controller?
  before_filter :prepare_exception_notifier

  rescue_from ActionController::RoutingError, with: :controller_error  
  rescue_from ActiveRecord::RecordNotFound, with: :active_record_error


  rescue_from CanCan::AccessDenied do |exception|
    render file: "#{Rails.root}/app/views/pages/not_authorized.html.erb", status: 403
  end

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:role_id, :username, :first_name, :last_name, :address, :organization_name , :hours_in_day, :organization_id, :job_title])
    devise_parameter_sanitizer.permit(:account_update, keys: [:role_id, :username, :first_name, :last_name,:organization_id, :division_id, :department_id, :email, :password, :password_confirmation, :current_password, :job_title, :avatar, :building_id, :location_id])
  end

  private

  def storable_location?
    request.get? && is_navigational_format? && !devise_controller? && !request.xhr? 
  end

  def store_user_location!
    store_location_for(:user, request.fullpath)
  end

  def after_sign_in_path_for(resource)
    stored_location_for(resource) || root_path
  end

  def after_sign_out_path_for(resource_or_scope)
    new_user_session_path
  end

  def prepare_exception_notifier
    request.env["exception_notifier.exception_data"] = {
      current_user: current_user
    }
  end

  def active_record_error(exception)     
    respond_to do |f|       
      f.html{ render file: "errors/404", status: 404 }
      f.html{ render file: "errors/500", status: 500 }      
      f.js{ render partial: "errors/ajax_404", status: 404 }
      f.js{ render partial: "errors/ajax_500", status: 500 }    
    end
  end

end

1 Ответ

0 голосов
/ 11 мая 2018

Попробуйте следующее в application_controller

class ApplicationController < ActionController::Base
  after_filter :store_location

  before_action :authenticate_user!

  private
  def store_location
    # store last url as long as it isn't a /users path
    session[:previous_url] = request.fullpath unless request.fullpath =~ /\/users/
  end

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

это работает на моей руке

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