Ruby on Rails — Не удается установить файлы cookie в некоторых действиях

#ruby-on-rails #cookies #authorization

Вопрос:

Я пытаюсь установить файлы cookie target_path , с которыми пытался связаться неавторизованный пользователь, и после авторизации перенаправить его на цель. Все работает нормально и хорошо, но затем я попытался установить в качестве цели edit_test_path или create_test_path и другие методы с запросами POST/PATCH/PUT и, похоже, файлы cookie не устанавливаются. Что может быть в этом случае?

application.rb — Я устанавливаю файлы cookie здесь. authenticate_user! вызов почти каждого контроллера before_action s

 class ApplicationController < ActionController::Base
  protect_from_forgery with: :null_session

  helper_method :current_user,
                :logged_in?

  private

  def authenticate_user!
    unless current_user
      cookies[:target_path] = request.path_info

      redirect_to login_path, alert: 'Verify Email or Password'
    end
  end

  def current_user
    @current_user ||= User.find_by(id: session[:user_id]) if session[:user_id]
  end

  def logged_in?
    current_user.present?
  end
end
 

sessions_controller.rb — Я пытаюсь перенаправить на цель из файлов cookie здесь

 class SessionsController < ApplicationController
  def new; end

  def create
    user = User.find_by(email: params[:email])

    if useramp;.authenticate(params[:password])
      session[:user_id] = user.id

      cookies[:target_path] ? (redirect_to cookies[:target_path]) : (redirect_to root_path) # With verb POST cookies don't work
    else
      flash.now[:alert] = 'Verify Email or Password'
      render :new
    end
  end

  def exit
    session[:user_id] = nil

    redirect_to login_path
  end
end
 

Ответ №1:

Я не думаю, что вы можете сделать это с запросами на публикацию/РАЗМЕЩЕНИЕ/ИСПРАВЛЕНИЕ. Когда вы это делаете redirect_to , rails отправляет 302 Found ответ с location указанным в параметре redirect_to в вашем случае cookies[:target_path] или root_path .

Затем браузер понимает, что он должен сделать перенаправление, и отправляет запрос GET на URL, указанный в location заголовке. Вы не можете и не должны пытаться указывать ему выполнять запросы на публикацию/РАЗМЕЩЕНИЕ/ИСПРАВЛЕНИЕ — эти типы запросов обычно также требуют каких-либо данных (например, отправленной формы), которые сопровождают запрос. Вы все равно потеряли все эти данные во время перенаправления на страницу входа в систему.

Что я пытаюсь сказать — используйте эти перенаправления только для запросов GET. Это не будет работать для ПУБЛИКАЦИИ/РАЗМЕЩЕНИЯ/ИСПРАВЛЕНИЯ.