2013-03-27 87 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