Railsの画面にQRコードを表示

QRコードを表示したいと想う事は何度かあったのだけれど、Rubyでいい感じのライブラリが見当たらなかったので、しばらく放置してた。

久しぶりにRubyForgeを覗くとrqrcodeというすばらしいものがあるじゃないの。

補足:QRの画像データを作成するバージョンも作ってみた - 参照

ということで早速試してみた。いつもどおり試した環境は以下の通り。

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) %>

これでそれっぽいQRコードが表示される(手元のau携帯は読めた)。これは簡単でいいかもしれない。