How to generate a Javascript AJAX POST method and handle it in Ruby on Rails 3.0
I want to do something qui开发者_运维知识库te 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:
- Read data which was sent with AJAX POST
- 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
- 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.
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
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.
精彩评论