我在www.example.com上运行的应用程序控制器中有一个动作email
,我试图将email
的表单数据发送到www.data.example.com/email
,其中我的另一个应用程序收到请求,并且我能够以js
格式保存数据。但我想发送回确认到www.example.com并使用rjs
模板替换html。这里有一些代码供您参考:
email.html。erb 呼吁 www.example.com
<div id="div_content">
<%= form_for(@user, :url => "http://data.example.com/mail", :remote => true) do |f| %>
<%= f.label :email %>
<%= f.text_field :email%>
<% end %>
</div>
email申请动作:data.example.com/email -
def email
@user = User.create(params[:user])
respond_to do |format|
if @user.save!
format.html { redirect_to(user_page_path(@user.vip_id), :notice => 'Thank you! You are now on our priority list.') }
format.js
else
format.html { render :text => "user can not be saved at this moment!"}
end
end
end
email.js。rjs调用www.data.example.com/email
page.replace_html :div_content, :partial => "show", :object => @user
我可以在我的日志中看到请求从一个域一直到子域,甚至动作被触发,但是,我不能得到响应回主域。有没有办法发送回调到主域。我只是想反映在div_content
div内的形式的变化,并希望用_show.html.erb
的内容替换,这是我在我的子域。
苏利耶:)
发生这种情况是因为rails认为您试图对自己发起跨站点请求伪造攻击。默认情况下,rails有一个安全特性,拒绝来自外部源(即你的其他应用程序)的表单提交
最简单(但不是最安全)的方法是将此添加到您要发布数据的控制器的顶部:
protect_from_forgery :except => :email
再保险的评论
啊,我明白了,当我第一次读到你的帖子时,我没有很注意,抱歉。我错过了所有关于rjs的部分。
我当然不是rjs专家,但看起来你做的大部分事情都是对的。对我来说唯一可疑的部分是这一行:
page.replace_html :div_content, :partial => "show", :object => @user
我认为应该是:
page.insert_html(:bottom, "div_content", :partial => "show")
也可以尝试用
替换rjs模板page.alert("debug");
只是为了确保它真的不会回来,因为我怀疑它是…
伙计们,这是我要做的工作-
嗯,我试图做跨域通信使用我的两个RoR应用程序,因为我在我的问题中提到了!
最后我找到了一种方法来实现相同的使用"EasyXDM"(www.easyxdm.net)它解决了这个问题。它在大多数浏览器上都运行良好,包括IE7和Firefox的旧版本。如果你想完成它,CORS是另一个解决方案,但它无法在IE7上工作…
哇!现在我可以依靠我不同的应用程序之间的跨域通信,而不使用iFrame。