2012-07-25 98 views
1

當我嘗試設置我的請求頭的道理,我收到一個錯誤:路由錯誤:沒有路由匹配[OPTIONS]

ActionController::RoutingError (No route matches [OPTIONS] "/data"):

這裏是Ajax調用:

$.ajax({ 
    url: this.hostName + url, 
    type: 'POST', 
    data: data, 
    dataType: 'json', 
    beforeSend: function(xhr) { 
     xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); 
    }, 
    success: function(response) { 
     console.log('success'); 
     console.log(response); 
    }, 
    error: function(response) { 
     console.log('error'); 
     console.log(response); 
    } 
    }); 

如果我將請求標題留出:

Started POST "/data" for 127.0.0.1 at 2012-07-24 18:37:22 -0700

但我得到一個警告,指出:

WARNING: Can't verify CSRF token authenticity

任何想法,爲什麼發生這種情況?

+0

不確定您的代碼的上下文,但認爲我指出[jquery-ujs](https://github.com/rails/jquery-ujs)你不知道它的情況,它適合你的需求。 – deefour 2012-07-25 03:41:37

+0

你最終解決了這個問題嗎? – Ashitaka 2012-08-04 15:19:01

+0

是啊@Ashitaka,看到接受的答案。 – 2012-09-09 01:14:39

回答

1

你試過

$.ajax({ 
    url: this.hostName + url, 
    type: 'POST', 
    headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') } 
    data: { param : 'something' }, 
    dataType: 'json' 
}); 

然後在你的控制器PARAMS [:PARAM]會給你 '東西'。

如果你有興趣知道爲什麼你需要所有的X-CSRF-令牌的東西,this是一個很好的閱讀。基本上,Rails會自動在頁面中包含該令牌以保證您的應用程序安全。如果您檢查您的網站的任何頁面,你會在你的HTML文檔這樣的頭看到:

<meta content="guma1QdmO9Tn9SB4yV4DonkY4xf4Sy6lIvrFyHIaR1U=" name="csrf-token"> 

這是由包含在application.html.erb文件中的行<%= csrf_meta_tags %>創建。

Rails在常規的非GET請求中自動包含此令牌以保證它們的安全。但使用javascript和ajax,您必須通過使用jQuery函數$('meta[name="csrf-token"]'搜索DOM來獲取令牌。

現在,這不是非常有效,因爲您每次發出請求時都在搜索該令牌。所以,你應該做的,是用ajaxSetup,像這樣:

$.ajaxSetup({ 
    type: 'POST', 
    headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') } 
    dataType: 'json' 
}); 

而現在,只要你想發送一個請求,你需要的是這樣的:

$.ajax({ 
    url: this.hostName + url, 
    data: { param : 'something' } 
}); 

編輯:啊,我看。當你做什麼alert(this.hostName + url)?你又如何宣佈你的路線?因爲如果我沒有記錯,你可以使用相對URL而不是絕對URL,你不需要根部分。這裏有一個例子:

# routes.rb 
post "relative_url" => 'controller#action' 

# file.js 
$.ajax({ 
    url: "relative_url", 
    data: { param : 'something' } 
}); 
+0

感謝您的廣泛答案,但它仍然無法解決我的問題。當我添加標題時,出現路由錯誤(如上所述)。而不是'Started POST/data',我得到一個錯誤,說'啓動[OPTIONS]/data',沒有路由匹配[OPTIONS]。 – 2012-07-25 19:47:58

+0

看到我編輯的答案。 – Ashitaka 2012-07-25 22:48:11

+0

同樣的問題,但這並沒有解決它。我的ajax調用是一個跨域調用(使用CORS),並且只要我不在ajax設置中設置標題選項就行。我開始[選項] ...沒有路線匹配。 – 2012-10-16 23:56:04

0

你應該嘗試給予相對url而不是絕對的ajax。我有同樣的問題,並通過更改url工作

相關問題