1

У меня есть действие рабочего контроллера, которое прерывается, когда я добавляю вызов 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 при сбое.

ответ

1

Похоже, что authenticate_or_request_with_http_basic является либо рендерингом, либо перенаправлением. Я предполагаю, что это работает, когда вы перемещаете его в файл before_filter, потому что он возвращает false, который отменяет цепочку обратного вызова и вызывает отказ второго рендера? Просто догадаться ...

1

authenticate_or_request_with_http_basic calls render отправить HTTP-ответ, необходимый для базовой аутентификации HTTP (код состояния 401 Unauthorized). Подробности см. На странице Rails code.

+0

В этом случае, как остановить дальнейшее выполнение действия после того, как authenticate_or_request_with_http_basic вернул false? –

+0

Я бы поставил authenticate_or_request_with_http_basic вызов в файле before_filter. – rkb

+0

Как дальнейшее выполнение приостановлено в рамках одного действия? –