views:

31

answers:

2

I want to do something quite simple. Click a button on my html javascript page which sends a bunch of data to the server using the AJAX Post method. The server uses the data sent by the POST method to generate an xml file which it then sends back to the user so they can save it.

My knowledge of ruby on rails is very limited and I've looked at tutorials but none of them seem to simply explain how to handle POST requests. I don't need anything modified on the HTML page itself so the entire html page is static with the sending data part looking like:

//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);

In rails 3.0 I have /xmlsave routed to an action in a controller I made:

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

If I am even doing this correctly, can anybody explain to me or point me in the right direction to what I need to put under the xmlsave method to:

  1. Read data which was sent with AJAX POST
  2. Generate xml file from data string which is already xml.. just want to copy paste it into the contents of xml file I want to send back
  3. Send xml file to user (send_file ?)

I apologize if what I am trying to do is just completely bizarre or I have a completely wrong idea. Most of the tutorials I read go in the direction of creating partials using to edit parts of the html page the user is already looking at which I don't want to do. None of the tutorials I read seem to explain exactly where requests go and where data goes and where I should call functions etc and I am confused.

Thank you.

A: 

I think it's better to use a Javascript library like jQuery. after you can do you Ajax request more easily

You don't really need Ajax to do that. a simple link is enough.

shingara
Ok thanks for your input. I will look into jQuery. A reason why I need to use AJAX is I don't want the page to redisplay as the calculations I do on redisplay take ridiculously long I just want a feature to "save as" the contents on the page with no reload.
Mark
+1  A: 

I think you shouldn't use AJAX for that, since you want the user to get the XML in response and be able to save it. It should work as a form submit button or link. The form would send a POST request with the XML (I assume the XML is already in the document somewhere?) to your xmlsave method.

Normally this would render the response as application/xml and the browser would probably display the contents (default configuration). To avoid it, you could set content type to application/octet-stream - this way the browser would prompt to save the file and the page wouldn't be refreshed (so no AJAX required).

To "cut/paste" fragments of the incoming XML into the result, you'd probably have to parse the incoming data and then pass the resulting DOM model or its fragment into a template of the new XML. You can use hpricot or nokogiri to parse and then render xmlsave.xml.erb as a result.

Here's a rough idea how it could work:

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>

NOTE: this code is using Rails 3 templates

Matt
Thanks for your help!! I managed to retrieve the data xml string using a submit button and just send_data params[:xmldata] and it worked without having to parse using hpricot. However I noticed another problem where there seems to be a limit to POST data size on rails. I send 1746269 chars from html but rails only recognizes 524288 of them. Is there some sort of upper limit on POST data in rails?
Mark
Nevermind the char size limit, I managed to send the POST data as an array with batches of characters and concatenated them together on server side.
Mark