петля перенаправления в рельсах

Вопрос может быть прочитан как:

Я был в состоянии отсоединения с HEAD в 23b6772 и набрал git reset origin/master (потому что я хотел раздавить). Теперь я передумал, как вернуться к HEAD в 23b6772?

Прямой ответ: git reset 23b6772

Но я столкнулся с этим вопросом, потому что мне стало тяжело печатать (скопировать и вставлять) хеши фиксации или его аббревиатуру каждый раз, когда я хотел ссылаться на предыдущий HEAD, и был Googling, чтобы увидеть, есть ли какая-либо стенография.

Оказывается, есть!

git reset - (или в моем случае git cherry-pick -)

Что, кстати, было таким же, как cd -, чтобы вернуться к предыдущему текущий каталог в * nix! Так ура, изучил две вещи одним камнем.

0
задан sabaeus 9 April 2019 в 11:11
поделиться

3 ответа

1137 Подход кажется верным. Однако использование текущего подхода приведет к циклу перенаправления, если исходный запрос будет направлен в сторону 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!

0
ответ дан Anuj Khandelwal 9 April 2019 в 11:11
поделиться

Подход полностью действителен. Вам просто нужно проверить текущий контроллер и действия: если они уже включены users_onboard_path, вам не нужно перенаправлять снова.

0
ответ дан milgner 9 April 2019 в 11:11
поделиться

Ваше приложение перенаправляет, потому что, когда вы нажимаете на вход, условие 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]
0
ответ дан Vincent Rolea 9 April 2019 в 11:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: