2012-12-05 44 views
3

我目前正在使用包裝gem has_barcode的Barby gem生成條形碼字符串我有:j5xvvcz。如何爲Barby生成字符串code_128條形碼

的Gemfile寶石(主要是爲那些誰是新的這個解決方案)

#for barcode generation 
gem "barby", "~> 0.5.0" 
gem "has_barcode", "~> 0.2.0" 
gem "rqrcode", "~> 0.4.2" #for qr code support 

代碼,我在我的模型

include HasBarcode 

has_barcode :barcode, 
      :outputter => :svg, 
      :type => :code_93, 
      :value => Proc.new { |p| "#{p.number}" } 

如果我把它渲染到屏幕:

如果我嘗試生成一個qr_code或一個code_93,它一切正常,但code_128或code_39工作,得到一個數據不是VA蓋子消息。 我擔心code_93在某些設備上不會被識別,因爲它似乎沒有被廣泛採用(從我讀的here 128將是最好的解決方案)

這似乎是我可能會做錯了,因爲代碼對於code_128是有效的,因爲我測試了它here

任何人都知道我的方法可能會出錯嗎?

回答

1

code_128顯然模式'A'不適合barby小包。所以我不得不模式B工作。

當前發佈的has_barcode的gem版本強制模式'A',所以我添加了一點「home-patch」,同時向github添加了一條建議。

這是我最後has_barcode.rb文件:

require "rubygems" 
require "i18n" 
require "active_support" 
require "active_support/hash_with_indifferent_access.rb" 
require "active_support/inflector.rb" 
require "barby" 

require "has_barcode/configuration" 

module HasBarcode 
    def self.included(base) 
    base.send(:extend, ClassMethods) 
    end 

    module ClassMethods 
    def has_barcode(*args) 
     options = args.extract_options! 
     @@barcode_configurations ||= {} 
     @@barcode_configurations[args.first] = HasBarcode::Configuration.new(options) 

     define_method args.first do 
     if options[:type] == :code_128 
      @@barcode_configurations[args.first].barcode_class.new(options[:value].call(self), options[:code128]) 
     else 
      @@barcode_configurations[args.first].barcode_class.new(options[:value].call(self)) 
     end 
     end 

     define_method "#{args.first}_data" do |opts| 
     if opts 
      send(args.first).send("to_#{options[:outputter]}", opts) 
     else 
      send(args.first).send("to_#{options[:outputter]}") 
     end 
     end 

    end 

    def barcode_configurations 
     @@barcode_configurations 
    end 
    end 

end 

我的模型:

has_barcode :barcode, 
       outputter: :svg, 
       type: :code_128, 
       code128: 'B', 
       value: Proc.new { |p| "#{p.number}" } 

和我的觀點:

<%= my_model.barcode_data(xdim:2, height:60).html_safe %> 

請注意,在當前日期(2012- 12-05)當前gem不會更新,允許傳遞輸出參數(如xdim和height)的最新更改。

這個答案是基於最新的代碼更新(相關問題)和我自己的建議,並且可以發現here

雖然這種解決方案並不嵌入has_barcode寶石,我會直接用巴比:

在我的模型說:

def get_barcode(number) 
    require 'barby' 
    require 'barby/barcode/qr_code' 
    require 'barby/outputter/svg_outputter' 

    barcode = Barby::Code128B.new("#{number}") 

    barcode.to_svg(xdim:2, height:60) 
    end 

視圖:

<%= my_model.get_barcode(my_model.number).html_safe %> 
相關問題