Railsの画面にQRコードを表示
QRコードを表示したいと想う事は何度かあったのだけれど、Rubyでいい感じのライブラリが見当たらなかったので、しばらく放置してた。
久しぶりにRubyForgeを覗くとrqrcodeというすばらしいものがあるじゃないの。
補足:QRの画像データを作成するバージョンも作ってみた - 参照
ということで早速試してみた。いつもどおり試した環境は以下の通り。
- Ruby 1.8.7 P160
- Rails 2.1.2
- rqrcode 0.3.2
rqrcodeのインストールはドキュメントにあるようにgemで一発
#gem install rqrcode
利用方法もシンプルでQRコードにしたい文字列を放り込むとQR表示用の配列を作り上げる感じ。
require "rubygems" require "rqrcode" @qr = RQRCode::QRCode.new( 'http://d.hatena.ne.jp/tgg.edit', :size => 4, :level => :h ) puts @qr.to_s
いかのようなテキストが得られる
xxxxxxx xx x xxxxxx x xxxxxxx x x x x x x x xxx x x xxxxxx x x x x xxx x x xxx x xx xx xx xxx x xxx x x xxx x xxx xxx x x xx x xxx x x x xxx x x x x x xxxxxxx x x x x x x x x x xxxxxxx xxxx x x x xx xx x xxxx x x x xx x xx x xx xxxx xxx x xxxx x xxx x xxxx xxxxxx xxx x xxx x xxx x x xxx xxxx x xx x x x x x x x x xx x x xx x xx x x x xxx x x x x xx xx xx xxx xxx x x x xxxxx x x xx x xx xxx x x x x x x xx x x xx xx xxxx x xxxx x xx xxx xx xxxx xx xx xx x x x xxx x xxxx xxxx xxx xxx xxx x x xxx x x x x x x xx xx x x xxx x xxx x x xxx xx x x x xxxx x x xxx xxx x x x x xx xxxxxxx x x x x x xxxxxx x xxxx x x xx xx x xxxxxxx xx xx x x x xxxxx x x x x x x xx x xx xxx x x xxx x xxxxxxx x xx x xxxxxxx xx x xxx x xxx xxxx xx x x xx x xxx x x xx xx x xxxxx x x xxxx x xx x x xxxx xxxxxxx x x xx x x xx x
これが配列で入っているので、これに合わせて画像を作ってやれれば読めるようになるという仕掛け。
Railsで画面に表示するので、以下の用にしてみた(基本的にはサンプルの通りまねてる)。
まずは、RAILS_ROOT/config/environment.rbにgemを記述
Rails::Initializer.run do |config| config.gem "rqrcode" #この行を追加
つぎに表示用のスタイルシートファイルを作る。
RAILS_ROOL/public/stylesheets/qr.cssを作成して以下の用に記述。サンプル版はQRのサイズがすごく大きいのでこれは小さいサイズに変更してある(携帯で読み込めるサイズ)
table { border-width: 0; border-style: none; border-color: #0000ff; border-collapse: collapse; } td { border-width: 0; border-style: none; border-color: #0000ff; border-collapse: collapse; padding: 0; margin: 0; width: 2px; height: 2px; } td.black { background-color: #000; } td.white { background-color: #fff; }
これをビューで表示する為のヘルパーを追加。
RAILS_ROOT/helpers/application_helper.rbを以下の用にしてみた。
module ApplicationHelper # QRオブジェクトを渡されたら、表示用テーブルにして返す。 # 画面の表示には対応するスタイルシートが必要 def qr(qr_obj) html= <<-EOS <table> <%- qr_obj.modules.each_index do |x| -%> <tr> <%- qr_obj.modules.each_index do |y| -%> <%- if @qr_on.is_dark(x,y) -%> <td class="black"/> <%- else -%> <td class="white"/> <%- end -%> <%- end -%> </tr> <%- end -%> </table> EOS ERB.new(html,nil,"-").result(binding) end end
単純に渡されたオブジェクトを展開してテーブルにしてるだけ。
後は、QRコードを表示したいコントローラでQRコードのスタイルシートを読み込んで(<%= stylesheet_link_tag 'qr' %>)、前述の例にあるように@qrオブジェクトを作成して、表示するだけ。
コントローラのメソッドで適当な文字列をいれてつくって
@qr = RQRCode::QRCode.new( 'http://d.hatena.ne.jp/tgg.edit', :size => 4, :level => :h )
ビューファイルで表示するだけ
<%= qr(@qr) %>