Layout for static pages?

Rails people,

Suppose I have an HTML file in public/ :

I am static.html

And suppose I have a layout file in app/views/layouts/ :

I am layout_for_static.rhtml <%= @content_for_layout %>

I’m trying to figure out a way to get the static
file to act as a template so that I get it loaded
into @content_for_layout

Anyone have any thoughts on this ?

I’m thinking I need to write a before_filter in application.rb
and maybe work a bit with config/routes.rb

Anyone have any thoughts on this ?

-Dan

ok,

I wrote something that is about 80% there.

idea 1:
script/generate controller serve_static index

2:
copy all the static content here:
app/views/serve_static

3:
add a line to the END of routes.rb

map.connect ‘*anything’, :controller => “serve_static” , :action =>
‘index’

Edit index()
inside of
app/controllers/serve_static_controller.rb

All the info I need is inside of request.request_uri

Just two lines gets me 50% there:

def index
the_file_name = ‘serve_static’ + request.request_uri
render(:file => the_file_name, :layout => true, :use_full_path
=>true,
:content_type => “text/html”)
end

Get more elaborate:
-look at file suffixes to guess about content_type: jpg, txt, html,
xml…
-rescue if I make a bad assumption about file existence

Result:

class ServeStaticController < ApplicationController

def index
logger.info 'request.request_uri is ’
logger.info request.request_uri.inspect

# get the file name from the request_uri
the_file_name = 'serve_static' + request.request_uri
logger.info 'the_file_name is '
logger.info  the_file_name

# Look for something like this:
# /some/path//gna.rl-e_y#%jnk/-/file.whatever
# We want to know if whatever exists and if so, what it is.
regexp = /(^\/.+)(\.\w+$)/

the_match = regexp.match request.request_uri

logger.info 'the_match.to_a.inspect is '
logger.info the_match.to_a.inspect

case
when the_match.to_a[2] == nil
  # No file extension so maybe we have index.html there
  begin
    render(:file => the_file_name + '/index.html' , :layout => true,

:use_full_path =>true)
rescue
# If nothing there, just render index.rhtml
render
end
else
logger.info 'the suffix is ’ + the_match.to_a[2]
begin
case
when the_match.to_a[2] == ‘.jpg’
render(:file => the_file_name, :layout => false,
:use_full_path
=>true, :content_type => “image/jpg”)
when the_match.to_a[2] == ‘.gif’
render(:file => the_file_name, :layout => false,
:use_full_path
=>true, :content_type => “image/gif”)
when the_match.to_a[2] == ‘.png’
render(:file => the_file_name, :layout => false,
:use_full_path
=>true, :content_type => “image/png”)
when the_match.to_a[2] == ‘.txt’
render(:file => the_file_name, :layout => true,
:use_full_path
=>true, :content_type => “text/text”)
when the_match.to_a[2] == ‘.xml’
render(:file => the_file_name, :layout => true,
:use_full_path
=>true, :content_type => “text/xml”)
else
render(:file => the_file_name, :layout => true,
:use_full_path
=>true, :content_type => “text/html”)
end
rescue
# If nothing there, just render index.rhtml
render
end
end
end
end

The statement,

You simply cannot have anything in /public that needs rails interaction.

is of great help.

So, my approach will probably be:

script/generate controller serve_static

Then tar-copy my tree of static .html, .htm, .txt, .jpg, .gif …
to:
app/views/serve_static

Then put this in
config/routes.rb :

You can have the root of your site routed by hooking up ‘’

– just remember to delete public/index.html.

map.connect ‘’, :controller => “serve_static”

Next, I need to figure out how to deal with an arbitrary URL.

For example:

/I/am/just_some/page.txt
/me/too.html
/ya/Im/a/picture.jpg
/mr/htm/here.htm
/Iam/just/slash/so/call/indexhtml/
/Im/not/even/slash

I know that I’ll have access to
request.request_uri

So, I’m smelling a case statement with 8 whens
based on
.txt
.html
.jpg
.gif
.png
.htm
/
“”

Let’s say I know that I want to render a .txt file,
how do I actually render it?

I guess I should take a close look at render()
or any of its cousins.

Any thoughts anyone?

Thanks!

-Dan

---------- Forwarded message ----------
From: Dan B. [email protected]
Date: Sep 18, 2006 1:39 PM
Subject: Layout for static pages?
To: [email protected]

Rails people,

Suppose I have an HTML file in public/ :

I am static.html

And suppose I have a layout file in app/views/layouts/ :

I am layout_for_static.rhtml <%= @content_for_layout %>

I’m trying to figure out a way to get the static
file to act as a template so that I get it loaded
into @content_for_layout

Anyone have any thoughts on this ?

I’m thinking I need to write a before_filter in application.rb
and maybe work a bit with config/routes.rb

Anyone have any thoughts on this ?

-Dan

My end-users can write simple HTML and .txt files .
They want me to supply layouts, and other webmaster skills.

“Dan B.” wrote

I wrote something that is about 80% there.

[snip]

Just curious. Why would one want to do this?

One note - it may be a little icky, but you could revert back to the
old-style
idea of server-side includes for layouts, using ERB directly. Check out
this

http://www.brainbag.net/blog/articles/2005/12/22/using-erb-rhtml-templates-on-dreamhost

for an idea of how to make it work. Essentially, you would use ERB in
the
files
in /public to include headers/footers on the page. Getting shtml and PHP
flashbacks…

On 9/19/06, Dan B. [email protected] wrote:

I wrote something that is about 80% there.

[snip]

Just curious. Why would one want to do this?


Matt J.
[email protected]
President/Technical Director, Acme Art Company (acmeartco.org)