A me il codice

codice:
def leggi
  File.open @file, 'r' do |f|
    while line = f.gets
      puts line
    end
  end
end
non da alcun problema. Quale versione di Ruby usi?

L'errore che da a te è probabilmente legato ad un errore di esecuzione. Infatti IOError è un errore restituito in caso di problemi con lo stream.

Ma tu valorizzi la variabile @file prima di lanciare il metodo?
Comunque non ha molto senso un metodo simile se non nel contesto di una classe.
Se lo vuoi tenere come metodo dovresti fare qualcosa tipo

codice:
def leggi(file_path)
  File.open(file_path, 'r') do |f|
    while line = f.gets
      puts line
    end
  end
end
Il codice è poi ancora semplificabile in

codice:
def leggi(file_path)
  File.foreach(file_path) do |line|
    puts line
  end
end
e per scriverlo alla Ruby way

codice:
def leggi(file_path)
  File.foreach(file_path) { |line| puts line } 
end