simple eruby -- including files

C

Chad Perrin

NOTE: I'll try one more time. For some reason, this message hasn't
been getting through. It occurred to me that the mailing list might be
discarding messages with (X)HTML in them, so I replaced all greater-than
and less-than symbols with the corresponding bracket symbols. Please
pretend, while reading this, that it's all valid XHTML -- and please
forgive me if all three messages ultimately make it through.


I've been playing with eruby a little bit -- a VERY LITTLE bit, mind
you. I haven't gotten far yet.

It seems like an excellent way to finally get away from PHP in certain
types of work I do. The problem is that some of the concepts of PHP
don't seem to translate directly, and the only howtos I'm able to find
for eruby are anemic at best. There's plenty of stuff about how to
install it, and precious little about how to make use of it.

My current frustration is figuring out how to achieve the following:

1. an index.rhtml page that defines some variables

2. a template.whatever page that contains an XHTML page with evaluation
of ruby variables defined in the index.rhtml page to produce
page-specific content

In PHP, it would be something like the following example.

index.php:
[?php
$title = "Home";
require_once('template.php');
?]

template.php:
HTML:
[head]
[title]Welcome [?php echo $title ?][/title]
[/head]
[body]
[p]blah blah blah[/p]
[/body]

So . . . ideas? How would I go about achieving the same results with
eruby? Unless and until I can figure this out, there's a HUGE roadblock
in my way of the application of the DRY principle.
 
J

John Joyce

It really does work pretty much the same way as you would do it with
PHP.
You can make it as simple or as complex as you like.
Use Ruby include or require for the same files.
eRuby is just a lot more concise than PHP is the result.
Your pages become readable again.
It's not different in terms of breaking up files into:
Commonly reused elements (header, navigation, footer, analytics scripts)
Content unique to a page.

For a simple, fairly static site, you're biggest concern is this
organization of files.
Anything that is the same on multiple pages should get put into a
separate file.

Of course you can also always just parse files by having the files
written and produced once then storing those, thus saving the
processing time on the server.
 
C

Chad Perrin

It really does work pretty much the same way as you would do it with
PHP.
You can make it as simple or as complex as you like.
Use Ruby include or require for the same files.
eRuby is just a lot more concise than PHP is the result.
Your pages become readable again.
It's not different in terms of breaking up files into:
Commonly reused elements (header, navigation, footer, analytics scripts)
Content unique to a page.

Could you provide an example? The following, an apparently direct
translation from PHP (as far as I can tell), doesn't work.

index.rhtml:
<%
title = "Home"
require 'template.rhtml'
%>

template.rhtml:
<html>
<head>
<title>Welcome <%= title %></title>
</head>
<body>
<p>blah blah blah</p>
</body>
For a simple, fairly static site, you're biggest concern is this
organization of files.
Anything that is the same on multiple pages should get put into a
separate file.

I'm aware of this. That's why I'm trying to figure out how to make the
above tactic work.

Of course you can also always just parse files by having the files
written and produced once then storing those, thus saving the
processing time on the server.

Not always an option -- but I have used it in the past.
 
E

Ezra Zygmuntowicz

Could you provide an example? The following, an apparently direct
translation from PHP (as far as I can tell), doesn't work.

index.rhtml:
<%
title = "Home"
require 'template.rhtml'
%>

template.rhtml:
<html>
<head>
<title>Welcome <%= title %></title>
</head>
<body>
<p>blah blah blah</p>
</body>
</html>

Chad-

Erb doesn't do anything like that by default. But you can fudge it
pretty easily:

ez work $ cat include.rb
require 'erb'
def _include(template, bind=binding)
erb = ERB.new(IO.read(File.join(File.dirname(__FILE__),template)))
erb.result(bind)
end
ez work $ cat foo.rhtml
<% require 'include' %>
<% 10.times do %>
<%= _include 'bar.rhtml' %>
<% end %>
ez socialpicks $ cat bar.rhtml
<%= "hello world!" %>
ez work $ erb foo.rhtml


hello world!


hello world!


hello world!


hello world!


hello world!


hello world!


hello world!


hello world!


hello world!


hello world!


You can't use 'include' because of Module#include so I used
_include. Have fun!


Cheers
-- Ezra Zygmuntowicz
-- Lead Rails Evangelist
-- (e-mail address removed)
-- Engine Yard, Serious Rails Hosting
-- (866) 518-YARD (9273)
 
C

Chad Perrin

Erb doesn't do anything like that by default. But you can fudge it
pretty easily:

ez work $ cat include.rb
require 'erb'
def _include(template, bind=binding)
erb = ERB.new(IO.read(File.join(File.dirname(__FILE__),template)))
erb.result(bind)
end
ez work $ cat foo.rhtml
<% require 'include' %>
<% 10.times do %>
<%= _include 'bar.rhtml' %>
<% end %>
ez socialpicks $ cat bar.rhtml
<%= "hello world!" %>

Thank you. I was hoping there was something simpler (using eruby.cgi
rather than erb) than rolling my own, but I do appreciate your example
and will put it (or something like it) to work. I guess I just assumed
too much about how eruby would work. At least now I won't waste my time
trying to figure out what I'm doing wrong.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top