繁体   English   中英

如何在Ruby on Rails 3.0中生成Javascript AJAX POST方法并进行处理

[英]How to generate a Javascript AJAX POST method and handle it in Ruby on Rails 3.0

我想做一些很简单的事情。 单击我的html javascript页面上的按钮,该按钮使用AJAX Post方法将一堆数据发送到服务器。 服务器使用POST方法发送的数据来生成xml文件,然后将其发送回用户,以便他们保存。

我对Rails上的ruby的了解非常有限,我看过教程,但是它们似乎都不能简单地解释如何处理POST请求。 我不需要在HTML页面本身上进行任何修改,因此整个html页面是静态的,发送数据部分如下所示:

//data is a huge string already xml > 1mb
xmlhttp=new XMLHttpRequest();
xmlhttp.open('POST', "http://localhost:3000/xmlsave", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send(data);

在rails 3.0中,我将/ xmlsave路由到我制作的控制器中的某个动作:

class MyController < ApplicationController
  def xmlsave
    #Read data sent with POST and put it in generated xml file and send to user
  end
end

如果我什至正确地做到了这一点,任何人都可以向我解释或将正确的方向指向我需要在xmlsave方法下输入的内容:

  1. 读取通过AJAX POST发送的数据
  2. 从已经是xml的数据字符串生成xml文件。只想复制粘贴到我想发回的xml文件的内容中
  3. 将xml文件发送给用户(send_file?)

如果我要做的事情完全是离奇的,或者我有完全错误的想法,我深表歉意。 我阅读的大多数教程都朝着创建部分的方向发展,该部分用于编辑用户已经在查看的html页面的部分,而我不想这样做。 我阅读的所有教程似乎都没有确切解释请求去向,数据去向,应该在哪里调用函数等,这让我感到困惑。

谢谢。

我认为您不应该为此使用AJAX,因为您希望用户获得XML作为响应并能够保存它。 它应该作为表单提交按钮或链接。 该表单会将带有XML的POST请求(我假设XML已经在文档中的某个位置?)发送到xmlsave方法。

通常,这会将响应呈现为application/xml ,浏览器可能会显示内容(默认配置)。 为了避免这种情况,您可以将内容类型设置为application/octet-stream这样浏览器将提示您保存文件,并且不会刷新页面(因此不需要AJAX)。

要将传入的XML片段“剪切/粘贴”到结果中,您可能必须解析传入的数据,然后将生成的DOM模型或其片段传递到新XML的模板中。 您可以使用hpricotnokogiri进行解析,然后呈现xmlsave.xml.erb

这是一个大概的思路:

xmlsave.html.erb:

<%= form_tag xmlsave_models_path(:format => :xml) do %>
  <%= hidden_field_tag :data, '<input><justatest id="tagid">test content</justatest></input>'%>
  <%= submit_tag %>
<% end %>

model_controller.rb:

def xmlsave
  input  = Hpricot.XML(params[:data])  
  respond_to do |format|
    format.html
    format.xml {render :content_type => 'application/octet-stream', :locals => { :input => input } }
  end 
end

xmlsave.xml.erb:

<myxml>
  <input>
    <%= (input/"#tagid").inner_text %>
  </input>
</myxml>

注意:此代码使用Rails 3模板

我认为最好使用jQuery之类的Javascript库。 在您可以轻松完成Ajax请求之后

您实际上并不需要Ajax来做到这一点。 一个简单的链接就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM