Вопрос может быть прочитан как:
Я был в состоянии отсоединения с HEAD
в 23b6772
и набрал git reset origin/master
(потому что я хотел раздавить). Теперь я передумал, как вернуться к HEAD
в 23b6772
?
Прямой ответ: git reset 23b6772
Но я столкнулся с этим вопросом, потому что мне стало тяжело печатать (скопировать и вставлять) хеши фиксации или его аббревиатуру каждый раз, когда я хотел ссылаться на предыдущий HEAD
, и был Googling, чтобы увидеть, есть ли какая-либо стенография.
git reset -
(или в моем случае git cherry-pick -
)
Что, кстати, было таким же, как cd -
, чтобы вернуться к предыдущему текущий каталог в * nix! Так ура, изучил две вещи одним камнем.
users_onboard_path
. current_user_has_complete_profile_and_stripe_account
before_action, когда исходный запрос направлен на действие users/onboard
. Чтобы сделать это, вы можете добавить следующую строку в users_controller.rb
, прямо вверху, внутри класса контроллера (при условии, что файл содержит действие onboard
):
skip_before_action :current_user_has_complete_profile_and_stripe_account, only: [:onboard]
. мы бы в основном пропустили current_user_has_complete_profile_and_stripe_account
действие, вызываемое до выполнения действия onboard
, и, следовательно, удалили цикл.
ОБНОВЛЕНИЕ:
Я попытаюсь проиллюстрировать это с помощью созданного мной тестового приложения:
[ 1132]
Файл application_controller.rb
приложения выглядит следующим образом:
class ApplicationController < ActionController::Base
before_action :current_user_has_complete_profile_and_stripe_account
private
def current_user_has_complete_profile_and_stripe_account
p "I'm in the before_action call current_user_has_complete_profile_and_stripe_account"
if some_condition?
p "I'm redirecting to the onboard API"
redirect_to onboard_users_path
end
end
def some_condition?
true
end
end
В этом файле мы определяем обратный вызов before_action
для перенаправления на входящий путь.
[тысяча сто тридцать четыре] [тысяча сто тридцать четыре] Файл users_controller.rb
этого приложения выглядит следующим образом:
class UsersController < ApplicationController
def login
p "I'm in login"
render json: { message: "This is a message from login action" }
end
def onboard
p "I'm in onboard!"
render json: { message: "This is a message from onboard action" }
end
end
Когда я пытаюсь запустить API входа в систему, я сталкиваюсь с циклом перенаправления, как видно из вывода терминала:
Started GET "/users/login" for ::1 at 2019-04-10 11:16:09 +0530
Processing by UsersController#login as */*
"I'm in the before_action call current_user_has_complete_profile_and_stripe_account"
"I'm redirecting to the onboard API"
Redirected to http://localhost:3001/users/onboard
Filter chain halted as :current_user_has_complete_profile_and_stripe_account rendered or redirected
Completed 302 Found in 1ms (ActiveRecord: 0.0ms)
Started GET "/users/onboard" for ::1 at 2019-04-10 11:16:09 +0530
Processing by UsersController#onboard as */*
"I'm in the before_action call current_user_has_complete_profile_and_stripe_account"
"I'm redirecting to the onboard API"
Redirected to http://localhost:3001/users/onboard
Filter chain halted as :current_user_has_complete_profile_and_stripe_account rendered or redirected
Completed 302 Found in 1ms (ActiveRecord: 0.0ms)
[ 1143] По сути, мы нажимаем метод before_action
в вызове для входа в систему первым и пытаемся перенаправить на onboard_users_path
. Однако при вызове /users/onboard
в перенаправлении мы снова нажимаем на блок before_action
, и он снова пытается перенаправить нас на /users/onboard
, и это становится циклом. skip_before_action :current_user_has_complete_profile_and_stripe_account, only: [:onboard]
к нашему users_controller.rb
, мы получим следующий вывод:
Started GET "/users/login" for ::1 at 2019-04-10 11:22:34 +0530
Processing by UsersController#login as */*
"I'm in the before_action call current_user_has_complete_profile_and_stripe_account"
"I'm redirecting to the onboard API"
Redirected to http://localhost:3001/users/onboard
Filter chain halted as :current_user_has_complete_profile_and_stripe_account rendered or redirected
Completed 302 Found in 3ms (ActiveRecord: 0.0ms)
Started GET "/users/onboard" for ::1 at 2019-04-10 11:22:34 +0530
Processing by UsersController#onboard as */*
"I'm in onboard!"
Completed 200 OK in 1ms (Views: 0.3ms | ActiveRecord: 0.0ms)
Как видно из журнала, вход в систему перенаправляет на борт, но здесь, before_action
перенаправление пропускается, и мы получаем ответ по желанию.
Точно так же, в вашем примере также, первый вызов перенаправляет на onboard
, а затем последующие вызовы также продолжают перенаправляться, потому что обратный вызов before_action
работает и для действия onboard
!
Подход полностью действителен. Вам просто нужно проверить текущий контроллер и действия: если они уже включены users_onboard_path
, вам не нужно перенаправлять снова.
Ваше приложение перенаправляет, потому что, когда вы нажимаете на вход, условие users_signed_in? && current_user.username.blank?
все еще выполняется. Поэтому один и тот же обратный вызов запускается, потому что все ваши контроллеры наследуются от ApplicationController
, и вы в итоге получаете цикл перенаправления.
Вы можете добавить чек в ваш обратный вызов, чтобы убедиться, что вы еще не во входной
return if request.path =~ /onboard/
Другое решение было бы иметь все действия вашего контроллера относительно входящей, чтобы пропустить обратный вызов
skip_before_action :current_user_has_complete_profile_and_stripe_account, only: [:onboard]