snowangel
snowangel

Reputation: 3462

Basic question about how to call a method

I really should know this... but I don't. Here's is a method provided in the documentation for a gem, Barby:

valid?()

And here is a functioning callback in my model:

  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 

However, sometimes I get a 'data not valid' error, so I'd like, obviously, to use the valid? method. But I don't know how to call it. If I do

  if self.productidentifier_idvalue.valid? 

I get

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

Edit: more errors:

If I do

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

I get the Barby error 'data not valid'

Upvotes: 1

Views: 672

Answers (3)

Benoit Garret
Benoit Garret

Reputation: 13675

If you're giving an invalid ISBN here

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

it's no wonder it gives you the data not valid error. Check the value of self.productidentifier_idvalue and make sure it's 12 digits (the regexp to validate the code can be seen here).

Update

Replace "'#{self.productidentifier_idvalue}'" with self.productidentifier_idvalue. The way you're doing it, the result of your expression is '123456789012', which is two quotes too many.

Besides, you don't really need to call valid?, it's done in the initializer as you can see here.

Upvotes: 2

flq
flq

Reputation: 22849

According to the exception, you're calling this on a string, which doesn't know that method. You need to call it on wherever your Barby::Barcode instance is.

According to the documentation "Bookland" is a special case of "pure" EAN-13 data.

So, maybe doing something like

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

Should get you closer to your aim

Upvotes: 1

Matthew Rathbone
Matthew Rathbone

Reputation: 8269

The valid? method exists only on objects which are instances of the Barcode class

You're calling this method on a String.

Upvotes: 0

Related Questions