Barby failing to generate some QR Codes - nil.rszf
In irb
data = "2 1058 657682" barcode = Barby::QrCode.new(dat开发者_C百科a) File.open('barcode.png', 'w+') {|f| f.write barcode.to_png(:height => 100, :margin => 25, :xdim => 100) }
Generates error:
ActionView::TemplateError (/Library/Ruby/Gems/1.8/gems/barby- 0.4.0/vendor/rqrcode/lib/rqrcode/qrcode/qr_code.rb:296:in `map_data': You have a nil object when you didn't expect it!
The error occurred while evaluating nil.rszf) on line <a href="/toretore/barby/issues/#issue/1" class="internal">#1</a> of app/views/profile/ticket.rpdf:
1: pdf.font_families["Helvetica"] =
2: {
3: "b" => "Helvetica-Bold",
4: "i" => "Helvetica-Oblique"
lib/pdf_render.rb:46:in `pdf'
barby (0.4.0) vendor/rqrcode/lib/rqrcode/qrcode/qr_code.rb:291:in `each'
barby (0.4.0) vendor/rqrcode/lib/rqrcode/qrcode/qr_code.rb:291:in `map_data'
barby (0.4.0) vendor/rqrcode/lib/rqrcode/qrcode/qr_code.rb:287:in `step'
barby (0.4.0) vendor/rqrcode/lib/rqrcode/qrcode/qr_code.rb:287:in `map_data'
barby (0.4.0) vendor/rqrcode/lib/rqrcode/qrcode/qr_code.rb:172:in `make_impl'
barby (0.4.0) vendor/rqrcode/lib/rqrcode/qrcode/qr_code.rb:196:in `get_best_mask_pattern'
barby (0.4.0) vendor/rqrcode/lib/rqrcode/qrcode/qr_code.rb:195:in `each'
barby (0.4.0) vendor/rqrcode/lib/rqrcode/qrcode/qr_code.rb:195:in `get_best_mask_pattern'
barby (0.4.0) vendor/rqrcode/lib/rqrcode/qrcode/qr_code.rb:145:in `make'
barby (0.4.0) vendor/rqrcode/lib/rqrcode/qrcode/qr_code.rb:85:in `initialize'
barby (0.4.0) lib/barby/barcode/qr_code.rb:94:in `new'
barby (0.4.0) lib/barby/barcode/qr_code.rb:94:in `rqrcode'
barby (0.4.0) lib/barby/barcode/qr_code.rb:55:in `encoding'
barby (0.4.0) lib/barby/outputter.rb:86:in `encoding'
barby (0.4.0) lib/barby/outputter/png_outputter.rb:67:in `height'
barby (0.4.0) lib/barby/outputter.rb:116:in `send'
barby (0.4.0) lib/barby/outputter.rb:116:in `with_options'
barby (0.4.0) lib/barby/outputter.rb:114:in `each'
barby (0.4.0) lib/barby/outputter.rb:114:in `inject'
barby (0.4.0) lib/barby/outputter.rb:114:in `with_options'
barby (0.4.0) lib/barby/outputter/png_outputter.rb:18:in `to_canvas'
barby (0.4.0) lib/barby/outputter/png_outputter.rb:58:in `to_png'
barby (0.4.0) lib/barby/barcode.rb:70:in `send'
barby (0.4.0) lib/barby/barcode.rb:70:in `method_missing'
(eval):107:in `pdf'
(eval):88:in `each'
(eval):88:in `pdf'
lib/pdf_render.rb:18:in `eval'
lib/pdf_render.rb:46:in `pdf'
lib/pdf_render.rb:18:in `render'
...
Whereas if I change data to "2 1058 657681" (replace the final '2' for a '1') it works fine.
Gems:
barby 0.4.0 png 1.1.0 (1.2.0 kept getting String::CompilationError)
In line 295 of barby-<version>/vendor/rqrcode/lib/rqrcode/qrcode/qr_code.rb, change
if byte_index < data.size
into
if byte_index < data.size && ! data[byte_index].nil?
Have fun!
Tried with Barby 0.4.2 and it fails as well. The problem is in the RQRCode library which is still in version 0.3.2.
You can try and pass a :size parameter to override the dinamically calculated one but it will eventually fail on a different string.
The only way I found to bypass the problem was to try in one level and try another if it fails.
begin
student_barcode = Barby::QrCode.new(content, :level => :q)
rescue NoMethodError
student_barcode = Barby::QrCode.new(content, :level => :m)
end
An error generated in one level did not occur in another.. wierd but works.
Cheers! Looks like rqrcode and in turn Barby have been updated to fix this bug. toretore/barby
精彩评论