2013-03-27 118 views
4

我希望能夠將表單提交到兩臺服務器。這就是爲什麼(如果有更好的方法做到這一點,我是所有的耳朵)向兩臺服務器提交表單

我有一個iframe嵌入機械土耳其人。 iframe中有一個表單。

當工作人員提交表單,我需要做兩件事情:

我需要通知我的本地服務器,這樣我可以採取一些行動的時候了。 我需要將結果發佈到mturk,以便turk顯示下一個作業。

如果我不這樣做,我的服務器需要輪詢turk工作完成,這是效率低下。

我試過多種方案,但無法讓他們工作。

我曾嘗試使用AJAX做當地一個帖子,一個表單提交,使用的代碼如下所示:

<%= form_for(@task, :url => "http://workersandbox.mturk.com/mturk/externalSubmit", 
:remote => true, :method => "post", :authenticity_token => false) do |f| %> 

.... 

,並在我的unobstrusive JS文件

$(form).post({url: "/notify",opt, function() {console.log("notify done")}); 

此結果在js錯誤

XMLHttpRequest cannot load http://workersandbox.mturk.com/mturk/externalSubmit. Origin http://mytest.herokuapp.com is not allowed by Access-Control-Allow-Origin. 

我無法控制服務器,所以我無法解決這個問題。

任何有關這樣做的正確方法的建議將受到感謝。

+4

直接從客戶端進行雙重提交是一種可怕的方法。如果兩臺服務器需要這些數據,然後將表單提交到一個(本地服務器)上的腳本,該腳本執行自己的處理,並作爲其他服務器的代理 - 即。發出自己的HTTP請求。有了這個想法,你應該能夠從本地服務器到客戶端做出單一的迴應,涵蓋兩個方面。 – 2013-03-27 03:00:44

+0

是的,這就是我想要做的 - 但表單提交必須從客戶端完成,以便turk可以轉發到下一張圖片。從服務器執行POST不會刷新iframe,因爲turk服務器無法更新它 – 2013-03-27 03:19:36

+0

但「下一個圖像」當然只是一個url,它可以通過響應中的「傳送」。 – 2013-03-27 03:23:39

回答

2

這對jQuery很容易做到。本質上,如果您使用.serialize()方法,則可以將數據發佈到任意位置。

假設你有一個形式,例如:

<form> 
    <input type="text" id="field1" name="field1" value="abc123" /> 
    <input type="text" id="field2" name="field2" value="def456" /> 
    <input type="submit" value="Submit" /> 
</form> 

可能您執行POST

$(function() { 
    $('form').submit(function() { 
     var data = $(this).serialize(); 

     $.post("http://www.location1.com/somePlace/", data, function() { }); 
     $.post("http://www.location2.com/anotherPlace/", data, function() { }); 

     return false; 
    }); 
}); 
+1

感謝您的建議 - 嘗試了這一點,沒有骰子。我得到同樣的錯誤:XMLHttpRequest無法加載http://workersandbox.mturk.com/mturk/externalSubmit。 Access-Control-Allow-Origin不允許Origin http://mytest.herokuapp.com。 – 2013-03-27 05:17:21

+1

您是否嘗試從服務器加載數據?一個XMLHttpRequest將表明你正試圖從不同的域讀取數據,而不是你從中提供的數據。 – 2013-03-27 15:25:41