2011-08-31 34 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