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 к неподписанному, он будет прекрасен:
unsigned mask = ~ (unsigned) 0 >> 1;
printf("%u\n", mask);
Редактирование на комментарии: или используйте неподписанную литеральную нотацию, которая намного более сжата.:)
unsigned mask = ~0u >> 1;
printf("%u\n", mask);
То, что происходит, ~0
интервал со всем набором битов (-1
). Теперь Вы сдвиг вправо 1
; так как это -1
, расширение знака сохраняет самый высокий набор битов, таким образом, это осталось со знаком (это не то, что Вы ожидали). Затем это преобразовывается в неподписанный как Вы, ожидают.
Попробуйте это:
unsigned mask = (unsigned) ~0 >> 1;
printf("%08x\n", mask);
RHS присвоения рассматривают как количество со знаком, если Вы не бросаете его, что означает, что Вы видели расширение знака без броска. (Я также изменил Ваш оператор печати для отображения числа в шестнадцатеричном числе, которое легче для меня декодировать.)
~0 строка.>> оператор смещает их, и в значении со знаком, он смещает в биты высшего порядка. Таким образом, можно сместить все, что Вы хотите, результат не изменится.