У меня есть действие рабочего контроллера, которое прерывается, когда я добавляю вызов authenticate_or_request_with_http_basic
в начале блока. Вот не функционирующий код действия:Получение AbstractController :: DoubleRenderError при использовании 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» ответ ошибки в моем окне браузера со следующим сообщением:
рендер и/или перенаправлять были названы несколько раз в этом действии. Обратите внимание, что вы можете вызывать только рендер или перенаправление, и не более одного раза за действие. Также обратите внимание, что ни перенаправление, ни рендер не завершают выполнение действия, поэтому, если вы хотите выйти из действия после перенаправления, вам нужно сделать что-то вроде «redirect_to (...) и return».
Когда я помещаю «authenticate_or_request_with_http_basic» логику в отдельном действии, а затем настроить before_filter, чтобы запустить его в действие индекса, все хорошо. Однако я не использую эту логику для любых действий, кроме индекса, и я хотел бы знать, почему приведенный выше код не работает.
Решение
Я был в состоянии найти решение с помощью Тайлера и RKB. Вот оно:
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
возвращает "истина", если аутентификация прошла успешно. Он возвращает 401 при сбое.
В этом случае, как остановить дальнейшее выполнение действия после того, как authenticate_or_request_with_http_basic вернул false? –
Я бы поставил authenticate_or_request_with_http_basic вызов в файле before_filter. – rkb
Как дальнейшее выполнение приостановлено в рамках одного действия? –