Когда я отправляю запрос ajax моему рубиновому контроллеру, функция before_filter вызывается дважды для каждого запроса ajax. Я использую before_filter для аутентификации.Ruby On Rails before_filter называется дважды?
Аякса запрос я использую:
$.ajax({
type: 'GET',
url: 'URL_TO__RoR_Controller',
username: username,
password: password,
contentType: "application/json; charset=utf-8",
success: function(data){
console.log(data);
},
error: function(xhr, ajaxOptions, thrownError) {
console.log(arguments);
}
});
Код RoR:
class Api::MyController < ApplicationController
before_filter :authenticate
attr_reader :current_user
def authenticate
print "===================================\n"
authenticate_or_request_with_http_basic do |username, password|
print "\n--------------------------------\n"
print username, password
print "\n--------------------------------\n"
@current_user = User.authenticate(username, password)
print "===================================\n"
end
end
def show
print "=================IN SHOW=================="
end
end
Ответ RoR на запрос Ajax:
Started GET "URL_TO__RoR_Controller" for 127.0.0.1 at 2015-10-08 10:18:18 +0200
Processing by Api::MyController#show as JSON
Parameters: {"id"=>"show", "test"=>{}}
===================================
===================================
Filter chain halted as :authenticate rendered or redirected
Completed 401 Unauthorized in 1ms (ActiveRecord: 1.0ms)
Started GET "URL_TO__RoR_Controller" for 127.0.0.1 at 2015-10-08 10:18:19 +0200
Processing by Api::MyController#show as JSON
Parameters: {"id"=>"show", "test"=>{}}
===================================
--------------------------------
USERPASS
--------------------------------
User Load (0.2ms) SELECT `users`.* FROM `users` WHERE `users`.`authorized` = 1 AND `users`.`login` = 'USER' LIMIT 1
===================================
=================IN SHOW==================
Rendered URL_TO__RoR_Controller/show.json.rabl (0.8ms)
Completed 200 OK in 30ms (Views: 3.4ms | ActiveRecord: 1.7ms)
RoR конфигурации/routes.rb для этого одного контроллера:
Api::Application.routes.draw do
namespace :api, defaults: { format: :json } do
resources :MyController, only: [:show]
end
end
Так в основном функция Аутентифицировать, кажется, выполняется дважды для каждого запроса Ajax шлю. Похоже, что первая попытка аутентификации завершилась неудачей. Он даже не попадает в функцию authenticate_or_request_with_http_basic
. Во второй раз все кажется прекрасным.
Очевидно, что это неправильное поведение. Что вызывает эту проблему?
Edit:
Хорошо вот мои выводы при удалении before_filter:
1) При вынимании before_filter полностью проблема не возникает больше.
2) При сохранении/использовании before_filter, но заменяя authenticate_or_request_with_http_basic с 'истинным', как это:
def authenticate
true
end
проблема не происходит либо. Таким образом, проблема, похоже, вызвана authenticate_or_request_with_http_basic?
Возможно, это связано с процедурой ** CORS **. Сначала jQuery отправляет запрос перед полетом, а затем реальный. Можете ли вы предоставить свою конфигурацию 'config/routes.rb' и историю запросов вашего браузера? – Aetherus
Я не уверен, что вы имеете в виду с историей запросов браузера. Я добавил confige/routes.rb в исходное сообщение. Я также попытался отправить запрос с помощью приложений Windows и с помощью python Request. Эта проблема возникла с приложениями Windows, но не возникла с запросом python. Я не знаю, как запрос отправляется с приложениями Windows, потому что у меня нет доступа к исходному коду. – MeesterPatat
Типичный вариант использования для отладчика. установить точку останова в методе проверки подлинности. – Meier