#jquery #ruby-on-rails #ajax #cordova
#jquery #ruby-on-rails #ajax #кордова
Вопрос:
Я пытаюсь отправить запрос на вход в rails Restful API из моего приложения Phonegap на iOS.
Следующий код работает с jQuery 1.5, но не с jQuery 1.4.2.
Кто-нибудь знает, почему это так?
$.ajax({
type: 'POST',
url: urlFactory.getLoginURL(),
data: { 'email': emailVal, 'password': passwordVal },
success: onSuccess,
error: onError,
dataType: "json"
});
Веб-сервер выдает мне следующую ошибку:
Started POST "/login.json" for 127.0.0.1 at Mon Apr 18 00:29:38 0100 2011
Processing by SessionsController#create as JSON
Parameters: {"password"=>"[FILTERED]", "email"=>"example@gmail.com"}
User Load (0.3ms) SELECT users
.* FROM users
WHERE ( users
. id
IS NULL) LIMIT 1
Completed in 251ms
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
app/controllers/application_controller.rb:37:in require_authorisation_happened'
Rendered /usr/local/lib/ruby/gems/1.8/gems/actionpack- 3.0.3/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.4ms)
Rendered /usr/local/lib/ruby/gems/1.8/gems/actionpack- 3.0.3/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (14.1ms)
Rendered /usr/local/lib/ruby/gems/1.8/gems/actionpack- 3.0.3/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (23.4ms)
It returns following in the successful case:
users
Started POST "/login.json" for 127.0.0.1 at Mon Apr 18 00:16:25 0100 2011
Processing by SessionsController#create as JSON
Parameters: {"password"=>"[FILTERED]", "email"=>"example@gmail.com"}
User Load (0.3ms) SELECT .* FROM
users WHERE (
users .
id IS NULL) LIMIT 1
users
User Load (19.4ms) SELECT .* FROM
users WHERE (
users .
email= 'example@gmail.com') LIMIT 1
Completed 200 OK in 306ms (Views: 4.6ms | ActiveRecord: 19.7ms)
Ответ №1:
Вам не хватает токена подлинности. В rails2 вы можете использовать form_authenticity_token в вашем представлении для отображения токена подлинности, а затем вам нужно будет добавить его к параметрам, отправляемым формой.
В Rails3 все проще. Просто добавьте <%= csrf_meta_tag %> в начало вашего макета, а затем убедитесь, что вы используете rails.js библиотека для ajax. Это позволит получить токен подлинности и отправить его вместе с формой.
Здесь есть короткая запись http://www.themodestrubyist.com/2010/02/24/rails-3-ujs-and-csrf-meta-tags /
И пример приложения здесь https://github.com/grigio/rails3-ujs-demo.git
Комментарии:
1. Спасибо за ответ. Насколько я понимаю, rails.js используется для загрузки файлов. Действительно, он что-то делает, только когда обнаруживает тип файла в отправленной форме. Кроме того, токен csrf отключен при запросе json по умолчанию в rails3. Кроме того, я думаю, что это не объясняет, почему он работает с jquery 1.5, а с 1.4.2.
2. Rails.js включает ненавязчивый javascript-скрипт (UJS) и интерпретирует атрибуты данных Rails, выбирает csrf_meta_tag и работает с помощниками Rails, которые реализуют :remote => true. Но rails.js не работает с jQuery 1.4.2, только с 1.4.3 или более поздней версией.
3. ОК. Спасибо за ваш ответ, думаю, теперь я знаю проблему. Я думал, что rails отключает опцию protect_from_forgery для json, но, похоже, это не так. Причина, по которой это сработало с jquery 1.5, заключалась в том, что в версии rails до 3.04 была проблема с тем, что protect_from_forgery не работает при определенных условиях.