LoginSignup
8
9

More than 5 years have passed since last update.

Ruby/SinatraでQRコードを作成して画像で表示するシンプルな方法

Last updated at Posted at 2016-01-21

手順

基本この記事を参考にさせてもらいました。
Rubyで簡単にQRコード画像を生成する方法

画像表示は一時ファイル作って読み込んだりもできますが、
一番シンプルにdata_urlに変換してsrcに突っ込みました。簡単!

Gem追加

Gemfile
gem 'rqrcode_png'

Controllerの処理

main.rb
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で表示

index.haml
%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で読み取れずに焦る

qr.png

LINEのQRコード読み取りはおそらくURL前提らしく、
ブラウザで開けないようなデータを読み取ろうとしてもエラーになります。

localhost:5000/xxxとかをQRコード化しても、
LINEだと「読み取れない形式です」とかって言われちゃう。

これに気づかず出力方法がおかしいのかとしばらくハマりましたが、
単純に有効なURLじゃなかっただけでした。

ローカルでのテスト中は他のQRコード読み取りアプリを使って、
正しく情報が読み取れることを確認するのが正しいアプローチ。

まとめ

というわけで、URLをQRコードで共有する機能を実装して
スマホde百人一首がますます便利になりました。

スマホde百人一首

まだお正月気分が抜けてない人はぜひ遊んでみてくださいませ。

おしまい。

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9