Using Rails for consuming a web service

Hi,

I wrote pure Ruby code for consuming an existing web service. The
requests are send via net/http and are in XML format. That means I
have Ruby classes that look like this:

class Request
def initialize(myrequest)
…–> send myrequest via net/http to the web service
end
end

To use that class I have the following code:

f = Request.new(“This is a request”).xml
p f

Now I want to make a rails web form where I can type my request and
send that to my existing classes to perform the request. All I found
via search were forms that worked with databases. I don’t need a
database for that functionality. (I will need it later, when I store
the results, but that comes later!)

I already created a rails project and put my ruby file in the lib
folder. In my controller I have the following:

  f = Request.new("This is a request").xml
  @out = p f

So I am able to get the result of that request in my view via <%[email protected]
%>, but that is static.

How can I send “This is a request” via a web form from my view to that
ruby file?

I have no clue how to start. Again everything I find about rails is
database stuff.

I really hope that someone can help me here and give a clue how I can
start.

Cheers,
Sebastian

On Fri, Mar 11, 2011 at 3:23 AM, Sebastian
[email protected]wrote:

end
the results, but that comes later!)

How can I send “This is a request” via a web form from my view to that
ruby file?

I have no clue how to start. Again everything I find about rails is
database stuff.

I really hope that someone can help me here and give a clue how I can
start.

If I understand you correctly, you are looking to submit a form to a
rails
controller that will then access your Request model and return you the
results. It’s pretty easy if that is what you are looking for. Take your
class Request code and save it in the model folder as is naming the file
request.rb. Then generate a controller that you want to call with the
form
that will process the form and display requests. You can use all the
tutorial stuff you found already. You’re just using a model that is not
connected to a database. The key here is that your model request.rb is
not
inheriting from ActiveRecord::Base. It’s just a stand alone class file
that
you call like any other model.

B.

Yes that is exactly what I want.

OK , I copied my file in the models folder and I guess I need to
create the form in my view with a “form_tag”, or? Or do I need the
“form_for”?

My problem is that I don’t really know what I have to put in the
controller and my view (form) to call my model?

Can you give me a little example?

Sorry I am a real newbie to Rails. I am only good in Ruby.

What I have so far:

index.html.erb:

<% form_tag(???, :method=>‘post’) do %> #1. I don’t know
what I have to put in here. The corresponding method in my
controller???
Request:

<%= text_field_tag “request” %>
<%= submit_tag ‘Submit’ %>
<% end %>

<%[email protected]%> #3.
Should be output the results…

request.rb:

class Request
def initialize(myrequest)
…–> send myrequest via net/http to the web service
end
end

home_controller.rb:

class HomeController < ApplicationController #2. I don’t
know how to receive the value from the form and send it to my model
def index
end
end

On 11 March 2011 15:01, Sebastian [email protected]
wrote:

Yes that is exactly what I want.

OK , I copied my file in the models folder and I guess I need to
create the form in my view with a “form_tag”, or? Or do I need the
“form_for”?

My problem is that I don’t really know what I have to put in the
controller and my view (form) to call my model?

You don’t need anything in your form… it could just be a plain ol’
HTML form submitting to the URI of your controller.
In the controller, the params hash will have all the values from the
submitted form - so if you have a text input field named
“request_to_run”, you’ll have a params value:
params[:request_to_run]

…so you can do:

my_request = Request.new(params[:request_to_run])

(use debugging to confirm all the params values, etc, as I’m writing
this off the top of my head! :slight_smile:

In the controller action, populate “@results” with the results of your
model (BTW, I wouldn’t call it “Request”… that’s a reserved word in
Rails.

@results = my_request.groovy_method_that_does_some_work

in your view you can conditionally draw it:

<%=h @results.inspect if @results %>

On the whole though, if this is all you want your Rails app to do,
then Rails is a bit of overkill. You’d (with your pure Ruby
experience) probably find Sinatra makes more sense for such a
requirement. Either way, Rails will do it too - it just loads up loads
of other functionality you’re never going to use :slight_smile:

On Fri, Mar 11, 2011 at 9:01 AM, Sebastian
[email protected]wrote:

<%= text_field_tag “request” %>
…–> send myrequest via net/http to the web service
end

You are definitely on the right track. Knowing Ruby before you learn
Rails
will give you a huge leg up when creating applications on Rails. Picking
up
the framework is easy and you’ll get the hang of it soon enough.

For what you are trying to do you should not use index as that is mostly
just for showing what you already know. You can change that behavior in
the
routing file but that is a more advanced topic for another day. To get
you
to where you want to be, the simplest example for handling a form is in
section 6.7 (and up) from this tutorial:
http://edgeguides.rubyonrails.org/getting_started.html#listing-all-posts
.
When looking at it, think of the Post model as your own Request model.
They
are the same except you are not using a database. So where you see
Post.all
or Post.find just know that if you want to use those methods you would
have
to write them yourself in your model or hook your model to a db through
ActiveRecord.

B.

Thank you very much you both:

My form is now working and looking like this:

Value1: <%= text_field_tag 'Value1', params[:value1] %> Value2: <%= text_field_tag 'Value2', params[:value2] %> Value3: <%= text_field_tag 'Value3', params[:value3] %> <%= submit_tag "Submit" %>

I followed the advice from Micheal and used pure html form. Rails form
is also working if I use this:

<% form_tag nil, :method => :get do %>
Value1: <%= text_field_tag ‘Value1’, params[:value1] %>
Value2: <%= text_field_tag ‘Value2’, params[:value2] %>
Value3: <%= text_field_tag ‘Value3’, params[:value3] %>
<% end %>

Is there any disadvantage to use pure html or rails???

My controller is looking this:

def index
@var1 = Mywebservice.new(params[:value1], params[:value1],
params[:value1]) if params[:value1]
end

So finally my controller is using the Mywebservice Model and save it
to the @var1, which can be read in my view.

I don’t know if my code is beautiful, but it is working!!

Sebastian

On 15 March 2011 15:02, Sebastian [email protected]
wrote:

My controller is looking this:

def index
@var1 = Mywebservice.new(params[:value1], params[:value1],
params[:value1]) if params[:value1]
end

Don’t you mean :
@var1 = Mywebservice.new(params[:value1], params[:value2],
params[:value3]) if params[:value1] && params[:value2] &&
params[:value3]

In your code, you’re not access value2 or value3…

I don’t know if my code is beautiful, but it is working!!

It may not be beautiful, but working is the important thing - beauty
is a bonus! :slight_smile:

Yes you are right I forgot to check if the other values are not nil.

Thank you!

Just another question with my webservice. I am using Savon for my SOAP
requests and the output is a XML or a very big hash made out of the
XML. That means it is a XML or hash with a lot of different tags and
it is getting very deep, if that is the right word.

XML:

<First_Layer>
<Second_Layer>
<Third_Layer>
Text that I want to get
</Third_Layer>
</Second_Layer>
</First_Layer>

hash:

{First_Layer => {Second_Layer => {Third_Layer => “Text that I want to
get”}}}

What is the easiest way to get out the information I want. Right now I
use the hash at use things like that:

puts resultarray[":First_Layer"][":Second_Layer"][“Third_Layer”]

That means a lot of code.

Thanks in advance
Sebastan

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs