#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. Это не будет работать для ПУБЛИКАЦИИ/РАЗМЕЩЕНИЯ/ИСПРАВЛЕНИЯ.