2012-12-05 46 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 %> 
相关问题