2011-08-31 62 views
1

我真的应该知道这个......但我不知道。这里的是Barby了宝石的文档中提供了一种方法,:关于如何调用方法的基本问题

valid?() 

,这里是一个有效的回调在我的模型:

require 'barby' 
    require 'barby/barcode/bookland' 

def barcode 

    if Barcodeimg.find_by_isbn_id(self.id).nil? 
    barcode = Barby::Bookland.new("'#{self.productidentifier_idvalue}'") 
    my_bc = Barcodeimg.new(:client_id => self.client_id, :isbn_id => self.id) 
    f = File.open("barcode.png", 'w+') 
    f.write barcode.to_png 
    my_bc.image = f 
    my_bc.save! 
    end 
end 

但是,有时我得到一个“数据无效”错误,所以我想,显然,使用有效的?方法。但我不知道该怎么称呼它。如果我做

if self.productidentifier_idvalue.valid? 

我得到

undefined method `valid?' for "9781551113180":String 

编辑:更多的错误:

如果我做

barcode = Barby::Bookland.new("'#{self.productidentifier_idvalue}'") 
if barcode.valid? 
#more 

我得到的巴比错误 '无效数据'

+1

你确定你的ID是一直有效吗? “数据无效错误”可能来自于此。 –

+0

该ID是,因为它是由应用程序创建的主键整数。我一直故意给它一个无效的ISBN13(pr​​oductidentifier_idvalue)。 – snowangel

回答

2

如果你在这里

barcode = Barby::Bookland.new("'#{self.productidentifier_idvalue}'") 

给人一种无效的ISBN,这也难怪它给你data not valid错误。检查self.productidentifier_idvalue的值并确保它是12位数(验证代码的正则表达式可以看到here)。

更新

更换"'#{self.productidentifier_idvalue}'"self.productidentifier_idvalue。你这样做的方式,你的表达的结果是'123456789012',这是两个引号太多。

此外,您并不需要致电valid?,它在初始化程序中完成,因为您可以看到here

+0

太好了。我使用了正则表达式:if /^(97(8|9))?\d{9}(\d|X)$/.match(self.productidentifier_idvalue),然后继续创建条形码,一旦我们知道ISBN有效。感谢您对我的耐心等待! – snowangel

+1

没问题。请注意,您也可以使用'if self.productidentifier_idvalue =〜/ ^(97(8 | 9))?\ d {9}(\ d | X)$ /',这有点更习惯(尽管它全部沸腾下来尝尝我想;-))。 –

1

根据例外情况,您打电话这是一个字符串,它不知道这个方法。您需要在Barby :: Barcode实例的任何位置调用它。

根据文档“Bookland”是“纯”EAN-13数据的特例。

所以,也许做这样的事情

bc = Barby::EAN13.new(productidentifier_idvalue) 
bc.valid? 

应该让你更接近你的目标

+0

多么有趣,我只是尝试,因为你发布,请参阅q编辑。这是抛出'数据无效'的错误(这就是为什么我试图插入数字)。嗯。 – snowangel

0

有效?方法仅存在于实例上的对象Barcode class

您在String上调用此方法。

+0

哦,是的,杜。你能看到我的问题编辑,看看为什么这下一次尝试不起作用? TA! – snowangel