Как хранить QR-коды в рельсах, сгенерированных из rqrcode - PullRequest
1 голос
/ 29 января 2020

Мне нужно сгенерировать QR-код и сохранить его в рельсах. Я использую rqrcode gem для создания QR-кода.

Вот как я генерирую QR-код в виде png.

  def generate_qr_code(checkin_url)
    qrcode = RQRCode::QRCode.new(checkin_url)
    png = qrcode.as_png(
      bit_depth: 1,
      border_modules: 4,
      color_mode: ChunkyPNG::COLOR_GRAYSCALE,
      color: 'black',
      file: nil,
      fill: 'white',
      module_px_size: 6,
      resize_exactly_to: false,
      resize_gte_to: false,
      size: 120
    )
    self.update!(qr_code_image: png.to_s)
  end

Проблема: У меня возникают проблемы при сохранении QR-кода в qr_code_image.

self.update!(qr_code_image: png.to_s), показывающего следующую ошибку:

*** NoMethodError Exception: undefined method `map' for #<String:0x007feb358121d0>
Did you mean?  tap

Четное IO.write("/tmp/github-qrcode.png", png.to_s), показывающее

*** Encoding::UndefinedConversionError Exception: "\x89" from ASCII-8BIT to UTF-8

Наконец я должен сохранить изображение в формате PNG в qr_code_image, где я использую

mount_uploaders :qr_code_image, QrCodeUploader

1 Ответ

0 голосов
/ 29 января 2020

Метод png.to_s возвращает двоичное содержимое файла

Чтобы записать файл из двоичного файла, запустите:

File.binwrite("/tmp/github-qrcode.png", png.to_s)

Если вы хотите сохранить файл png.to_s в вашей базе данных, Я думаю, что использование base64 - хороший выбор.

Чтобы сохранить base64 в вашей модели, код выглядит примерно так:

u = User.find(1)
u.qr_code_image = Base64.encode64(png.to_s)
u.save

Наконец, чтобы увидеть qrcode в браузере просто

<img src="data:image/png;base64,<%= user.qr_code_image %>" />
...