Я нахожу всю эту вещь перенаправления устройства довольно запутанной.
Когда @rorra говорит, что Devise использует session["#{scope}_return_to"]
, он означает, что Devise по умолчанию after_sign_in_path_for(resource)
будет использовать эту переменную через метод stored_location_for(resource)
.
Таким образом, вы должны сохранить местоположение, которое вы хотите сохранить, в переменной session["#{scope}_return_to"]
, которая обычно будет session["user_return_to"]
.Для этого поместите в ваш application_controller.rb следующее:
after_action :store_location
def store_location
# store last url - this is needed for post-login redirect to whatever the user last visited.
if (request.fullpath != "/users/sign_in" &&
request.fullpath != "/users/sign_up" &&
request.fullpath != "/users/password" &&
request.fullpath != "/users/sign_out" &&
!request.xhr?) # don't store ajax calls
session["user_return_to"] = request.fullpath
end
end
В некоторых случаях вам не нужно будет определять метод after_sign_in_path_for(resource)
, так как метод devise по умолчанию будет выполнять все перенаправления за вас, и если ихURL перенаправления недоступен, вы будете перенаправлены на корневой путь ресурса (обычно это корневой путь пользователя), а если он не существует, вы будете перенаправлены на корневой путь.Однако если вы хотите настроить, куда отправляется пользователь, если URL-адрес перенаправления недоступен, добавьте следующее в ваш application_contorller.rb (и соответственно измените root_path
):
def after_sign_in_path_for(resource)
stored_location_for(resource) || root_path
end