2013-02-04 66 views

回答

4

有跡象表明,你需要遵循一些步驟:

1)檢查提出的要求是否是JavaScript代碼。

驗證您應該檢查請求標頭以查看Accept參數是什麼。如果它說application/javascript那麼它都很好。使用像螢火蟲這樣的工具輕鬆檢查請求標題。

2)包含什麼javascript文件?

其次,開始試用:remote => true是必需的JavaScript庫不包括在你的代碼的時候很常見的問題。所以我的猜測是,下面的代碼是從您的佈局丟失:

<%= javascript_include_tag :defaults %> 
<%= csrf_meta_tag %> 

如果是這樣的話,就包括它的HTML頭內。

3)檢查控制器:它是否有respond_to塊?

如果用rails generate scaffold生成您的應用程序,它會像

respond_to do |format| 
     format.html 
     format.xml { .... } 
    end 

替換爲上面的代碼:

respond_to :html, :js 

OR

respond_to do |format| 
     format.html 
     format.js 
     format.xml { .... } 
    end 

4)設置CSRF令牌在你的application.js

$(function(){ 
    $.ajaxSetup({ 
    beforeSend: function(xhr) { 
     var token = $('meta[name="csrf-token"]').attr('content'); 
     if (token) xhr.setRequestHeader('X-CSRF-Token', token); 
    } 
    }); 
}); 

5)發表您的登錄信息

$.ajax({ 
    url: '/users/sign_in.json', 
    type: 'POST', 
    dataType: 'json', 
    data: {user: {email: '[email protected]', password: 'password'}}, 
    success: function(data, textStatus, xhr) { 
    //called when successful 
    } 
}); 
+0

謝謝!這讓我稍微接近一點。我現在收到錯誤**未定義的方法'爲'nil:NilClass **,** devise(2.1.2)lib/devise/failure_app.rb:129:在http_auth_header?**中。這*所有*通過html工作正常,但不是ajax。 –

+0

CSRF令牌正隨請求一起發送。登錄信息正在正確發送。 1,2,3,4,5全部退房。 –

+0

這似乎是你的設計路由問題。每次從任何策略或鉤子拋出':warden'時都會調用失敗應用程序(failure_app.rb)。負責根據當前範圍和映射將用戶重定向到登錄頁面。如果沒有給出範圍,則重定向到default_url。 –