Получение AbstractController :: DoubleRenderError при использовании authenticate_or_request_with_http_basic () - PullRequest
1 голос
/ 22 декабря 2011

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

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

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

1 голос
/ 23 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...