エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

RailsとHamlでSVG

ふつうに

ブラウザがインラインのSVG表示に対応していれば、HamlSVGを書くとそのまま表示してくれます。

app/controllers/circles_controller.rb

class CirclesController < ApplicationController
  def index
    @circles = 30.times.map { {x: rand(500), y: rand(500), r: rand(100)} }
  end
end


app/views/circles/index.html.haml

%svg{'xmlns' => 'http://www.w3.org/2000/svg', 'xmlns:xlink' => 'http://www.w3.org/1999/xlink', 'viewBox' => '0 0 500 500', 'width' => '100%', 'height' => '100%'}
  - @circles.each do |circle|
    %circle{cx: circle[:x], cy: circle[:y], r: circle[:r], stroke: 'red', fill: 'none'}


Rails を起動して http://localhost:3000/circles を開くとこんな感じ。

フォーマットにSVGを指定して

フォーマットを指定して、http://localhost:3000/circles.svg とアクセスしたい場合には、いくつか設定が必要になります。

MIME タイプを設定する

config/initializers/mime_types.rb に SVG を設定します。
次の1行を追加します。

Mime::Type.register 'image/svg+xml', :svg
Haml のフォーマットを設定する

Haml のフォーマットを XHTML にします。これをしておかないとXMLのDOCTYPE宣言が出力されません。
具体的には config/initializers/haml.rb を作成して次の内容を記述します。

Haml::Template.options[:format] = :xhtml
ビューを書く

拡張子をSVGにしたHamlを書きます。
内容はインラインで書いたものにDOCTYPE宣言を追加したものになります。

app/views/circles/index.svg.haml

!!! XML
%svg{'xmlns' => 'http://www.w3.org/2000/svg', 'xmlns:xlink' => 'http://www.w3.org/1999/xlink', 'viewBox' => '0 0 500 500', 'width' => '100%', 'height' => '100%'}
  - @circles.each do |circle|
    %circle{cx: circle[:x], cy: circle[:y], r: circle[:r], stroke: 'red', fill: 'none'}
img タグで表示する

MIME タイプを指定しているので、img タグを使っても表示することができます。
index.html.haml を次のように書き換えて http://localhost:3000/circles にアクセスすると通常の画像と同じように表示されます。

app/views/circles/index.html.haml

= image_tag circles_path(format: :svg)