前回の「erubyをERBに置き替える その2」では、行頭が%の行がRubyスクリプト片として認識されないと書きましたが、ERBオブジェクトをnewするときにtrim_modeを’%’にしてやれば認識されるようになります。

まず、「ruby.cgi」ファイルで、ERB.new()の第3引数に’%’を渡します。

#!/usr/local/bin/ruby
require 'erb'
require 'cgi'
puts 'Content-Type: text/html; charset=utf-8'
puts
ERB.new(IO.read(CGI.new.path_translated), nil, '%').run

「fruits.rhtml」のHTML中のRubyスクリプトを行頭%に変更してみます。

<%
itemList = []
File.foreach("list.db") do |line|
  line.chomp!
  itemList.push(line)
end
%><html>
 <body>
% itemList.each do |item|
  <p><%=item%></p>
% end
 </body>
</html>

ここで読み込んでいる「list.db」の中身は前回と同じです。

りんご
みかん
バナナ

ブラウザで「fruits.rhtml」にアクセスすると、下記のようなHTMLが戻ってくるので、うまく動作していることがわかります。

<html>
 <body>
  <p>りんご</p>
  <p>みかん</p>
  <p>バナナ</p>
 </body>
</html>

ERBのtrim_modeは’%’の他にもいくつかあって、たとえば’>’を指定すると%>の直後の改行は出力されなくなるので、前回書いた下記の「fruits.rhtml」でも、

<%
itemList = []
File.foreach("list.db") do |line|
  line.chomp!
  itemList.push(line)
end
%><html>
 <body>
<% itemList.each do |item| %>
  <p><%=item%></p>
<% end %>
 </body>
</html>

生成されるHTMLにはこのように余分な空行が出力されなくなります。

<html>
 <body>
  <p>りんご</p>
  <p>みかん</p>
  <p>バナナ</p>
 </body>
</html>

他にどんなtrim_modeがあるかは、ERBのマニュアルを参照してください。

※バージョンメモ

  • FreeBSD 10.0-RELEASE-p1 amd64
  • ruby-1.9.3.484_2,1
  • apache24-2.4.9_1