le comportement de la console étrange Rails
-
12-10-2019 - |
Question
Quand je lance une déclaration sur plusieurs lignes dans les Rails 3.0.1 console, appuyez sur Entrée ne fonctionne pas en fait la déclaration. Au lieu de cela, il va à une nouvelle ligne de la console, et le curseur a été onglets à droite. Ensuite, je dois exécuter une ligne de base (comme p "hey"
), puis la déclaration sur plusieurs lignes courrai.
ruby-1.9.2-p0 > images = Image.all;images.each do |im|; if im.imagestore_width.blank?;im.save;end;
ruby-1.9.2-p0 > p "hey"
Je l'ai fait comme ça pendant un certain temps et il fonctionnait bien. Mais maintenant, j'ai un problème dans la console et il pourrait être lié. Quand je courais le code ci-dessus, au lieu de fonctionner comme il le fait normalement, il vient de passer à une nouvelle ligne de la console avec un? ajouté
ruby-1.9.2-p0 > images = Image.all;images.each do |im|; if im.imagestore_width.blank?;im.save;end;
ruby-1.9.2-p0 > p "hey"
ruby-1.9.2-p0 ?>
Quand il fait cela, je ne peux pas quitter la console
ruby-1.9.2-p0 ?> exit
ruby-1.9.2-p0 ?> ^C
Ces problèmes sont liés? Comment puis-je les corriger?
La solution
Dans la ligne:
images = Image.all;images.each do |im|; if im.imagestore_width.blank?;im.save;end;
Vous avez un end
pour fermer la if
mais pas end
pour fermer le bloc do
du each
.
Ceci est la raison pour laquelle la console est réafficher l'invite pour demander plus d'entrée avant d'exécuter vos instructions.
Essayez:
images = Image.all;images.each do |im|; if im.imagestore_width.blank?;im.save;end;end
Remarquez, vous verrez le même comportement avec des supports. irb
ou console
ne seront pas exécutés jusqu'à ce que les crochets équilibre par exemple.
irb(main):010:0> (3 *
irb(main):011:1* (2 + 1)
irb(main):012:1> )
=> 9
Autres conseils
ne sais pas ce qui ne va pas avec irb / console mais votre code Ruby pourrait ressembler une plus belle beaucoup:
images = Image.all.each { |im| im.save if im.imagestore_width.blank? }
Le consensus général est d'utiliser {} plutôt que de faire / fin pour les blocs d'une seule ligne en rubis.