2010-06-25 3 views
1

Donc, j'ai écrit une simple classe Ruby, et l'ai mise dans mon répertoire rails/lib. Cette classe a la méthode suivante:Rails Fichier I/O: Qu'est-ce qui fonctionne dans Ruby ne fonctionne pas dans Rails?

def Image.make_specific_image(paths, newfilename) 
    puts "making specific image" 
    @new_image = File.open(newfilename, "w") 
    puts @new_image.inspect 
    @@blank.each(">") do |line| 
    puts line + "~~~~~" 
    @new_image.puts line 
    if line =~ /<g/ 
     paths.each do |p| 
     puts "adding a path" 
     puts p 
     @new_image.puts p 
     end 
    end 
    end  
end 

Ce qui crée un nouveau fichier et copie une chaîne hardcoded (@@blank) à ce fichier, l'ajout de contenu personnalisé à un certain endroit (après une étiquette g se trouve). Si je cours ce code de Ruby, tout est juste Peachy. Cependant, si j'exécute ce code à partir de rails, le fichier est créé, mais il est vide. J'ai inspecté chaque ligne du code: rien que j'essaie d'écrire dans le fichier est nul, mais le fichier est néanmoins vide.

Je suis vraiment perplexe ici. Est-ce une chose d'autorisations? Si oui, pourquoi Rails aurait-il sur EARTH les autorisations nécessaires pour MAKE un fichier, mais pas WRITE dans le fichier qu'il a fait?

Est-ce que les E/S de fichiers fonctionnent différemment dans les rails?

Plus précisément, j'ai une méthode de modèle qui appelle:

Image.make_specific_image(paths, creature.id.to_s + ".svg") 

qui fait avec succès un fichier du type « 47.svg » qui est vide.

+0

Êtes-vous sûr que '@@ blank' n'est pas, euh, vide lorsque vous utilisez Rails? Êtes-vous sûr que '@ new_image' est vidé et fermé sous Rails? – pilcrow

+0

Oui, j'imprime ligne (qui est un segment de @@ vide, et il a ce que je l'attends). En fait, je pense que je l'ai compris, va afficher une réponse .... – Jenny

Répondre

3

Avez-vous essayé d'appeler close sur le fichier une fois que vous avez terminé de l'écrire? (Vous pouvez également utiliser la syntaxe File.open basée sur un bloc, qui se fermera automatiquement une fois le bloc terminé). Je suppose que le problème est que les écritures ne sont pas vidées sur le disque.

+1

Vous monsieur, m'a sauvé beaucoup de frustration. Je n'ai même pas vu une méthode File.close dans l'API, donc ça ne m'est même pas venu à l'esprit. Rails fonctionne maintenant aussi vite que Ruby. Merci! – Jenny

0

Donc.

Apparemment, le fichier I/0 fonctionne dans Rails ... très, très lentement. En Ruby, dès que je regarde le dossier, c'est là, ça marche, tout est époustouflant. Avant, après avoir vu des fichiers vierges de Rails, je devais être frustré, puis supprimer le fichier et changer de code et réessayer (afin de ne pas être plein de spam, puisque chaque fichier est genearted sur la création de créature, donc Je finirais bientôt avec beaucoup de fichiers comme "47.svg" et "48.svg", etc.

.... Alors, j'ai pris ma pause déjeuner, je suis revenu pour voir si je pouvais dire si les autorisations du fichier généré par les rails étaient différentes du fichier généré par ruby ​​... et ont remarqué que le fichier RAILS n'est plus vide

Semble prendre environ cinq minutes pour que les rails puissent enfin écrire dans le fichier, même APRÈS affirme qu'il a fini de traiter tout cet appel. s quelques secondes. Pas vraiment sûr POURQUOI ils sont si différents, mais au moins maintenant je sais que ce n'est pas une chose de permissions.

Edit: En fait, sur certains dossiers prennent tant de temps, d'autres sont instantanés ...

Questions connexes