如何使用Barby为字符串生成code_128条形码

时间:2012-12-05 13:31:56

标签: ruby-on-rails barcode

我目前正在使用包装宝石has_barcode的Barby gem为我拥有的字符串生成条形码:j5xvvcz。

Gemfile gems(主要针对那些不熟悉此解决方案的人)

#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也无效,收到数据无效消息。 我担心的是,code_93在某些设备中不会被识别,因为它似乎没有被广泛采用(从我读到的here 128将是最好的解决方案)

这似乎是我可能做错了,因为代码对于code_128非常有效,因为我测试了它here

任何人都知道我的做法可能有什么问题?

1 个答案:

答案 0 :(得分:1)

显然,code_128的模式'A'不适合Barby的小型掌上电脑。

所以我必须让模式B工作。

当前发布的gem版本的has_barcode强制模式'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 gem中,但我将直接使用Barby:

在我的模型中添加:

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 %>