ERB

From DreamHost

Jump to: navigation, search

eRuby is an implementation that allows embedding Ruby inside HTML or other document, similar to PHP. It comes in several implementations: eruby is in C and faster; ERB is cross-platform and ships with Ruby. Both can be used on Dreamhost.

Setup

Create this file as e.g. /home/me/example.com/cgi-bin/erb.cgi:

#!/usr/bin/env ruby
# run ruby using the --debug flag for more descriptive errors

require "cgi"
require "erb"

# This cgi object is available in your RHTML files
cgi = CGI.new

# Optionally, enable using gems you've installed per http://forum.dreamhosters.com/programming/43221-gem-install-broken.htm#Post43228
ENV['GEM_PATH'] = "#{ENV['GEM_PATH']}:/home/YOUR_NAME/.gems"
# Optionally, require stuff here so you don't need to do this in each RHTML file
require "rubygems"

begin
  path = nil
  if (ENV['PATH_TRANSLATED'])
    path = ENV['PATH_TRANSLATED']
  else
    file_path = ENV['REDIRECT_URL'].include?(File.basename(__FILE__)) ? ENV['SCRIPT_URL'] : ENV['REDIRECT_URL']
    path = File.expand_path(ENV['DOCUMENT_ROOT'] + '/' + file_path)
    raise "Attempt to access invalid path: #{path}" unless path.index(ENV['DOCUMENT_ROOT']) == 0
  end

  # So that working directory is not here but where the .rhtml is:
  Dir.chdir(File.dirname(path))

  erb = File.open(path) { |f| ERB.new(f.read) }
  print cgi.header + erb.result(binding)

rescue Exception

 print "Content-Type: text/html\n\n"  
 if $DEBUG
   # print out more descriptive errors while debugging
   print "<h1>Script Error</h1>"
   print "<pre>#{ $! }</pre>"
   print "<h2>Backtrace</h2>"
   print "<pre>#{$!.backtrace.join("\n")}</pre>"
   print "<h2>Environment</h2>"
   print "<pre>#{ENV.keys.map { |key| key + ' = ' + ENV[key] + "\n"} }</pre>"
 else 
   print "<h1>ERB error</h1><p>#{ $! }</p>"
 end

end

The file must be in a web-accessible directory.

Make it executable:

chmod +x erb.cgi

Create or edit /home/me/example.com/.htaccess, adding this:

# If you want Apache to use index.rhtml in addition to index.php etc.
DirectoryIndex index.rhtml index.php index.html index.htm

AddHandler rubypage .rhtml
Action rubypage /cgi-bin/erb.cgi

Test

Test it with a page like this, for example as /home/me/example.com/test.rhtml. The extension must be rhtml.

<html>
<head>
  <title><%= title = "Testing!" %></title>
</head>
<body>
  <h1><%= title %></h1>
  <p>GEM_PATH: <%= ENV['GEM_PATH'] %></p>
  <p>Params: <%= cgi.params.inspect %></p>

</body>
</html>

See Also

Personal tools