【Rails】rqrcodeでQRコードを作成する
QRコード画像を作成して、画面に出したり画像として格納してみる
code:gemfile
gem 'rqrcode', '~> 0.9.0'
gem 'rqrcode_png', '~> 0.1.5'
gem 'chunky_png', '~> 1.4'
タスク編集画面でQRコード作成にチェックボックスを追加する
チェックがあった場合、QRコードを作成して保存する
qrcodeカラムにファイル名を格納するようにする
qrコードのファイル名を入れるカラム作成
bin/rails generate migration AddQrcodeToTasks
チェックボックスを追加して動作テストしてみる
code:_form.html.slim
.form-group
= f.label :qrcode_flag, class: 'form-check-label' do
= f.check_box :qrcode_flag, class: 'form-check-input', checked: true
| QRコードを生成する
code:task_controller.rb
def update
# qrcode_flagというカラムは存在しないので、それを除いてupdateする
@task.update!(task_params.except(:qrcode_flag))
# qrcode_flagパラメータにチェックが入っているならば、qrcodeカラムにdefault.pngを格納する
@task.update(qrcode: "default.png")
end
redirect_to tasks_url, notice: "タスク「#{@task.name}」を更新しました。"
end
qrqcodeを使用する準備を行う
参考
ビューでURLを動的に生成する場合
【Rails】任意のURLをQRコード化する方法(rqrcode)
ヘルパに記述して呼べるようにする
code:3_chapter/taskleaf/app/helpers/application_helper.rb
slim側でこんな感じで呼べるようになる
code:slim
p= qrcode('test', 10)
画像としてフォルダに保存する
qrコードの生成
オブジェクトを呼んでメソッドで作る。
code:rb
def create_qrcode
qrcode = RQRCode::QRCode.new(url)
# .pngで保存
@qr = qrcode.as_png(resize_gte_to: false, resize_exactly_to: false, fill: 'white',
color: 'black', size: 240, border_modules: 4, module_px_size: 6, file: nil # ファイルに保存せず、データを直接取得
)
フォルダへの格納
code:rb
# ファイル名はurlをMD5でハッシュ化した値とする
encripted_file_name=Digest::MD5.hexdigest(url)
# 格納先 存在しない場合は作成する
folder_path = "#{Rails.public_path}/uploads/task"
FileUtils.mkdir_p(folder_path) unless File.directory?(folder_path)
# pngで保存
IO.binwrite("#{Rails.public_path}/uploads/task/#{encripted_file_name}.png",@qr)
FileUtils.mkdir_p(folder_path)
引数のパスにフォルダを作成する
File.directory?
指定したパスがディレクトリであるかどうかを確認する
unlessで存在確認もできる。つまりディレクトリがない場合にmkdir_pで作成する流れになる
ビューで呼び出す
code:slim
img src="/uploads/task/#{@task.qrcode}"
src="uploads/task/#{@task.qrcode}"としちゃうと"/tasks/24/uploads/task/ac5d9a67af8760ea7a103d342daeb409.png"を参照してしまう
なので最初の/を忘れないようにすること
正しいURL先はhttp://localhost:3000/uploads/task/ac5d9a67af8760ea7a103d342daeb409.pngである
s3に入れたい場合など
carrierwaveを導入しているならそちらを経由すると良い。