У меня есть работающее действие контроллера, которое прерывается, когда я добавляю вызов к authenticate_or_request_with_http_basic
в начале блока. Вот код неработающего действия:
def index
authenticate_or_request_with_http_basic do |username, password|
username == "test1" and password == "test"
end
render layout: false, content_type: 'application/xml'
end
Я получаю сообщение об ошибке «AbstractController :: DoubleRenderError» в окне браузера со следующим сообщением:
Рендеринг и / или перенаправление вызывались несколько раз в этом действии. Обратите внимание, что вы можете вызывать только перенаправление render или не более одного раза за действие. Также обратите внимание, что ни перенаправление, ни рендеринг не прекращают выполнение действия, поэтому, если вы хотите выйти из действия после перенаправления, вам нужно выполнить что-то вроде «redirect_to (...) и return».
Когда я помещаю логику «authenticate_or_request_with_http_basic» в отдельное действие, а затем настраиваю before_filter для запуска его для действия index, все в порядке. Однако я не использую эту логику для каких-либо действий, кроме индекса, и я хотел бы знать, почему вышеприведенный код не работает.
Решение
Мне удалось найти решение с помощью Тайлера и РКБ. Вот оно:
authenticated = authenticate_or_request_with_http_basic "Authentication Required" do |username, password|
@user = User.find_by_username(username)
@user != nil && password == "test"
end
return unless authenticated == true
authenticate_or_request_with_http_basic
возвращает «true», если аутентификация прошла успешно. Возвращает 401 при ошибке.