手順
基本この記事を参考にさせてもらいました。
Rubyで簡単にQRコード画像を生成する方法
画像表示は一時ファイル作って読み込んだりもできますが、
一番シンプルにdata_urlに変換してsrcに突っ込みました。簡単!
Gem追加
gem 'rqrcode_png'
Controllerの処理
require 'rqrcode'
require 'rqrcode_png'
require 'chunky_png'
require 'base64'
get '/' do
@url = "http://hogehoge.com"
# QRコード画像作成
qr = RQRCode::QRCode.new( @url, :size => 5, :level => :h )
@qr_path = qr.to_img.resize(200,200).to_data_url
haml :index
end
Viewで表示
%img(src="#{@qr_path}")
これだけ。
ハマったところ
本番デプロイすると謎のエラー
ローカルでは動いてたのに、Herokuにデプロイするとこんなエラーを吐きました。
RQRCode::QRCodeRunTimeError - code length overflow. (260>208). (Try a larger size!):
どうやら指定してるサイズが小さいらしい。
RQRCode::QRCodeRunTimeError: code length overflow. (372>288) #15
ローカルで動かしてるときよりURLが長くなったので、
QRコードにする情報量が増えて、size:3では表現しきれんくなったのかと。
なので言われたとおりsizeを大きくしてあげたら無事解決。
(短めのURLなので5にしたら十分でした。適宜調整してください)
ローカルテスト時にLINEで読み取れずに焦る
LINEのQRコード読み取りはおそらくURL前提らしく、
ブラウザで開けないようなデータを読み取ろうとしてもエラーになります。
localhost:5000/xxxとかをQRコード化しても、
LINEだと「読み取れない形式です」とかって言われちゃう。
これに気づかず出力方法がおかしいのかとしばらくハマりましたが、
単純に有効なURLじゃなかっただけでした。
ローカルでのテスト中は他のQRコード読み取りアプリを使って、
正しく情報が読み取れることを確認するのが正しいアプローチ。
まとめ
というわけで、URLをQRコードで共有する機能を実装して
スマホde百人一首がますます便利になりました。
まだお正月気分が抜けてない人はぜひ遊んでみてくださいませ。
おしまい。