Can I use Sinatra to render dynamic pages?

Hell Team,

I wrote a very simple dashboard using shoes which basically displays
statistics, every second, of certain type of messages arriving at a
queue
under MQ. But in order for anyone to use it they have to install
Ruby, *shoes
*and its requirements. So I started experimenting with *Sinatra *to
re-write my simple application so anyone could point their browser and
get the dashboard displayed. I went over the first basic Sinatra
tutorial
but everything appears to be static. Is there any example out there that
shows Sinatra dynamically refreshing the page continuously with new
information, in my case message queues information?

In other words, once the user successfully get the page displayed, from
that point on I want the content to be refreshed dynamically with the
new
information without user intervention.

Thank you

1 Like

Rick,

Thank you for your quick reply. Although I am trying to avoid
javascript,
I’ll take a look at the links.

Thanks again

Dynamicly updating content on a page falls under Ajax (
Ajax (programming) - Wikipedia).

Did a quick google and found this:
http://ididitmyway.herokuapp.com/past/2011/2/27/ajax_in_sinatra/

On 6/13/2013 4:11 PM, Ruby S. wrote:

Rick,

Thank you for your quick reply. Although I am trying to avoid
javascript, I’ll take a look at the links.

Thanks again

The unfortunate truth is that when doing anything in the browser other
than rendering static content, JavaScript is required (ignoring browser
plugins like flash, silverlight, etc). A web server, by itself cannot
change the page once it’s been rendered.

There are attempts to make JavaScript more palatable (CoffeeScript,
ClojureScript, etc), however I highly recommend becoming comfortable
with JavaScript (and possibly a helper like jQuery) BEFORE using any of
these, as with any of these it’s still important to understand what’s
happening under the hood.

Well, I got some good suggestions from everyone here. I thank you all
for
that!
Now I just need to analyze each suggestion and pick he easiest for me. I
am
not by any mean a mature ruby programmer and I like to do things as easy
and simple as possible. If Sinatra is overkill for what I want, perhaps
I
should look into something different. I was wondering if TomCat might be
what I need. Anyway, the entire affair is kind of confusing to me as
this
is the first time I deal with this type of thing.

As I said, I am very grateful to all of you for taking the time to
answer
my post.

On Thu, Jun 13, 2013 at 11:55 PM, Nicholas Van W. <

You should be able to do this without JavaScript by using streaming.

Sinatra has a streaming API as of 1.3. Rails 4.0 is adding a “live” mode
for similar.

However you need to use a supporting web server and hook into the event
loop (which Rack exposes).

Simple Chat Application using the Sinatra Streaming API ¡ GitHub offers an example, but note that the
heroku app is broken (look at the comments for a link to a patched
version).

Nick

On Fri, Jun 14, 2013 at 6:14 AM, Ruby S. [email protected]
wrote:

simple as possible. If Sinatra is overkill for what I want, perhaps I should
look into something different. I was wondering if TomCat might be what I
need.

Uh, do you mean “Tomcat”, the Java servlet container? That would
seem to have exactly nothing to do with your question. :slight_smile:

I don’t see anyone suggesting Sinatra is “overkill”. The example
Sinatra-based chat app that Nick mentioned is 59 LoC.

Nick and everyone else,

Please accept my apologies if I hurt or insulted anyone feeling with my
blatant and clearly lack of knowledge and understanding. Please let me
elaborate:

I am an AIX system administrator not a programmer, although back on the
'70s I was heavily into assembler programming. I am trying to learn Ruby
as
it appears to me kind of much simpler than other languages such as C,
Java,
etc. I like simple and easy tools that can help me do my job more
efficient.

My statement about “overkill” WAS NOT INTENDED TO BE FOR Sinatra. If
you
go back you’ll find that I was talking about TomCat. I meant to say
that
perhaps TomCat was overkill for the simple thing that I wanted to do.
I
started playing with Sinatra and I to find it simple and very easy to
learn and use.

As I stated on my original post, I want to create a simple web-based
application, which will be invoked from a browser.
I will read a file every second. The file contains certain information
that
changes continuously, 24X7 from January 1 to December 31. This
information
collection NEVER stops.

I have NEVER done anything web related, NEVER. Perhaps, due to my lack
of
knowledge, I am not posting my question correctly.

I want:

  1. The user to fire up a browser pointing to my server URL
  2. My application will accept the request and send data to the user’s
    browser
  3. My application will, every second, read the content of the file
    and
    get the new counters
  4. Display the new information, counter, on the browser WITHOUT THE
    USER
    HAVING TO REFRESH IT. In other words, I want to refresh the browser’s
    content without user having to do anything. The new information must
    be
    continuously be updated and displayed.

As I said earlier, I did this using Ruby/Shoes, but this needs to be
used
by a number of people and I would have to install Ruby and Shoes every
desktop that needs to use this Dashboard.

Someone suggested Javascript but I don’t want to start learning yet
another
programming tool when I think that Ruby and some web tool such as
Sinatra
might be able to help me with this. Rails was also suggested. I am
probably still not making any sense!

I do want to thank you and others for all the answers already posted and
perhaps the ones to come.

Ruby S.

On Fri, Jun 14, 2013 at 9:01 PM, Nicholas Van W. <

Sinatra is as lightweight and simple a framework you can choose for
doing a
web app. You can create a complete app in a single file with template
included!

There is no such thing as Sinatra being overkill for a project. IMHO,
the
only simpler alternative is using paper, scissors and glue :slight_smile:

I love Sinatra and highly recommend it for anyone learning web
development.
Give it a shot- it’s a fantastic piece work.

Did you know that there are dozens, if not more, clones of Sinatra
across
different languages?

And the monster framework for the Node.js, Express, is Sinatra inspired?

And as Hassan mentioned, Tomcat is a “servlet” container for Java
servlets.
Not really related, and far, far more complicated than using Ruby and
Sinatra. I almost had post-traumatic stress syndrome flashbacks seeing
that
word- I haven’t use Tomcat in over eight years.

Good luck!

Cheers,
Nick

On Sat, Jun 15, 2013 at 9:46 AM, Ruby S. [email protected]
wrote:

My statement about “overkill” WAS NOT INTENDED TO BE FOR Sinatra. If you go
back you’ll find that I was talking about TomCat.

To quote:
“If Sinatra is overkill for what I want, perhaps I should look into
something different.”

And again, it’s “Tomcat”, NOT “TomCat”; precision counts, in programming
and
discussions about programming :slight_smile:

My application will, every second, read the content of the file

Is there any reason you can’t get the data direct from the process
that’s writing
that file? Reading from a file being written every second seems a bit
clumsy.
Just to muddy the water a bit :slight_smile:

Display the new information, counter, on the browser WITHOUT THE USER HAVING
TO REFRESH IT. In other words, I want to refresh the browser’s content
without user having to do anything. The new information must be continuously
be updated and displayed.

Someone suggested Javascript but I don’t want to start learning yet another
programming tool when I think that Ruby and some web tool such as Sinatra
might be able to help me with this. Rails was also suggested. I am probably
still not making any sense!

The difference between your Shoes application and a web app is
that a web app is a client-server architecture. You can certainly use
Ruby and Sinatra for the server part, which responds to data requests,
but those requests come from a web client, in this case a browser. And
JavaScript is the language you use to program behavior in browsers.

That said, you could most simplistically use a meta-refresh tag in
an iframe on your page to display the changing data without any
user action. I certainly wouldn’t try to refresh an entire page, even
a simple one, every second.

One way or another, you’re going to have to learn how web clients
work, though. :slight_smile:

Good luck,

On 15 Ιουν 2013, at 18:46 , Ruby S. [email protected] wrote:

Someone suggested Javascript but I don’t want to start learning yet another
programming tool when I think that Ruby and some web tool such as Sinatra might be
able to help me with this. Rails was also suggested. I am probably still not
making any sense!

Cheers,

–

–
Ruby S.

Sinatra is really simple and you can fire an application in no time. I
wrote a simple display website for a digital signage and the first
vesion was up and running in a about 2 hours and I didn’t knew anything
about web development either.

JavaScript is a pain in the ass. HTML is easy to learn but hard to
master and I hate CSS with a passion but by trial-and-error you can come
with a decent theme. I tried to use Coffeescript but I ended up just
copying code snippets and modifying them with only a slight idea of
what’s going on. Not a good thing. Just learn JavaScript, it’s used for
about anything and jokes apart: Sinatra + (HTML+CSS3+JavaScript) can
even get you a job.

I’m scratching rail’s surface right now, till at least, everything seems
really easy because of my little tiny sinatra bg: routers, helpers
(although never used them I know what they are and how they should be
used), viewers, logs and other predefined paths (sinatra is not MVC but
could be if you want to), and so own. With sinatra I used Sequel and
datamapper as ORM. I consider sequel a bit more up2date although DM
received an update about 15 days ago (After 2 years).

I wrote all just to say that learning Sinatra is easy so don’t be
afraid. Learning JavaScript (apparently) is hard but it’s worthy.

Best regards

Panagiotis (atmosx) Atmatzidis

email: [email protected]
URL: http://www.convalesco.org
GnuPG ID: 0x1A7BFEC5
gpg --keyserver pgp.mit.edu --recv-keys 1A7BFEC5

Hi,

First off, I was only writing enthusiastically out of my love of
Sinatra,
and only wish to be helpful.

Stepping back, I would suggest considering two of your goals before
making
a concrete recommendation:

  1. hosting- where and how will you host it?
  2. personal goals- what do you want to learn and for what purpose?

Your app sounds simple enough that anything will suffice so long as you
have your streaming solution. And there enough cut-and-paste code
examples
that you could event chose to do so with a client-side JavaScript
solution
rather than a server-side one.

  1. hosting
    =========
    If you knew Java already, worked in a J2EE shop, and had J2EE hosting in
    place, then Sinatra might be overkill because of the upfront learning
    and
    backend deploying and maintenance effort. Of course that assumes a
    friendly
    IT department- Sinatra or similar running from your desk machine may be
    the
    lowest friction solution, assuming that up-time isn’t the a huge
    requirement.

2- personal goals

I agree with another responder that learning Sinatra helps learn Rails.
But
in my opinion Rails is a lot to learn, and I wouldn’t recommend it
unless

  1. it’s fun for you, and/or 2) aligns with your personal goals.

So some questions would be:

  1. where do you plan on hosting your application?
  2. how reliable does it have to be?
  3. how secure does it have to be?
  4. how much do you want to learn about Ruby, JavaScript, HTML and CSS3?
  5. how much data are you sending per second? It sounds like you have a
    simple counter with 5 or 6 simple numbers?

If I were doing this app I would chose the following for maximum
technology
hipster fun:

  1. node.js with socket.io
  2. HTML + jQuery and socket.io for the web page.

But that’s mostly silly for the described app, and I do love and highly
recommend Ruby + Sinatra.

And since you’ve already done a version in Ruby Shoes, Sinatra sounds
like
a good bet.

I would also suggest learning jQuery for cut-and-paste logic to add to
your
HTML. A dirty-little secret of Rails applications is that they usually
contain more JavaScript then Ruby! So if you want to write significant
web
applications in the future JavaScript is a must.

I would suggest creating a pastebin or gist of your code and posting a
link
to that. It would be faster to have any further conversation in code.

Cheers,
Nick

Hey Panagiotis,

I really truly appreciate your kind words and suggestions.

Thank you

On Sat, Jun 15, 2013 at 5:24 PM, Panagiotis A.

Nick,

First, thank you very much for taking the time to shared your thoughts
with
me. Let me answer your items in order:

  1. where do you plan on hosting your application?

    • A - It will be hosted either on *NIX server, which is extremely
      reliable and powerful.
  2. how reliable does it have to be?

    • A - It must be VERY reliable. The Dashboard will be watch by all
      levels of managements and it must be THERE always.
  3. how secure does it have to be?

    • A - Secure. Although we are behind several level of firewalls.
  4. how much do you want to learn about Ruby, JavaScript, HTML and CSS3?

    • A - I love Ruby and I would like to continue learning it. Today, US
      father’s day, I spent over 9 hours already reading about JavaScript
      and
      going over tutorials.
  5. how much data are you sending per second? It sounds like you have a
    simple counter with 5 or 6 simple numbers?

    • A - Less than 50 bytes. Only few numbers that I then interpret and
      display on the Dashboard.

I would love to post something, but other than the Ruby/shoes
application,
I don’t have anything with the new client/server design.

Again, thank you for your help.

On Sun, Jun 16, 2013 at 2:33 PM, Nicholas Van W. <

in thin project, there a a async exemple which
is near your expects :

that send out of a ‘tail -f /var/log/system.log’ to each client.

Thanks everyone for your posts. I have received myriads of suggestions
which I totally appreciate. Some people have suggested also using
WebSocket
with Javascript. I found, however, that Ruby provides support for
WebSocket. I will look into that.

One important thing I would like everyone to keep in mind, I want the
client (my users) to only have to type a URL and walk away, while their
browsers continue to be updated by the server. I am not sure if this is
doable with WebSocket, but I will read into it.
I really thought and still think that what I want to do is a very simple
thing. The problem is my lack of knowledge and experience with this type
of
web application.

Thank you

Ruby S.

I really thought and still think that what I want to do is a very simple
thing.

push data to any browser is difficult.
WebSocket is ok for mobile/chrome/firefox/safari, nok for ie
thin demo there : https://gist.github.com/raubarede/5799539

gem install thin
gem install sinatra
gem install sinatra-websocket
ruby mouse.rb
open http://localhost:4567
open http://localhost:4567
… move the mouse in first page
… look what append in second page :slight_smile:

At my knowledge, in enterprise context, socket.io with node.js is the
only
universal (ready for almost all browsers) solution available

Hey Sadaf_N, Below you can find all the info you required
https://www.icicletech.com/blog/sinatra-ruby-microframework-for-rapid-web-and-api-development