6
votes

Syntaxe vérifiant ou "compiler" un rubis sur les rails

Je suis nouveau à Ruby et je suis récemment lancé dans une question de comparaison des valeurs lors de la création d'une application Ruby sur Rails. Dans un contrôleur, j'ai eu la déclaration suivante qui a toujours été renvoyée fausse: xxx

Le problème était l'utilisateur.Id (qui est un enregistrement actif) est un entier et des paramètres [: ID] est une chaîne. . Il m'a fallu un certain temps pour comprendre cela et je l'ai finalement changé à: xxx

maintenant l'instruction fonctionne comme prévu.

Pour éviter cette erreur à l'avenir, existe-t-il un moyen de "compiler" ou d'obtenir Ruby pour vous avertir si vous essayez de comparer 2 types différents? Certains autres problèmes que j'ai rencontrés dans la mesure où je voudrais "compiler un chèque" sont les suivants:

  • avertissez-moi si je crée une variable mais que je ne l'utilise pas. Pour aider à vérifier les fautes de frappe des noms de variables.
  • Assurez-vous qu'une méthode existe dans une classe afin que je puisse éviter les fautes de frappe de la méthode et également à refléter, par exemple si je renomme une méthode.

    Je suis actuellement en train d'utiliser Ruby 1.8.6-27 RC2 avec des rails 2.3.2 et des radrils IDE sous Windows.


4 commentaires

N'équive pas de réponses sur tester votre code. J'ai eu un test de l'unité pour le fragment de code ci-dessus et il n'a pas tenu à échouer (avec mes tests manuels) et je ne pouvais pas comprendre pourquoi. Ce que je cherche, c'est un vérificateur de syntaxe pour Ruby qui trouve des erreurs similaires Compilateur standard trouverait. Merci.


Un compilateur C ne vous donnera pas une erreur pour faire 4 == 5.5.


Découvrez Jetbrains Ruby IDE, JetBrains.com/Ruby


@Carsonwright, j'ai fini par utiliser RubyMine il y a environ un an et que la syntaxe de la Fly est une vérification de la syntaxe qui m'aide avec le problème ci-dessus. Merci pour la suggestion.


6 Réponses :


5
votes

test d'abord, puis code. Si vous écrivez des tests qui couvrent toutes les branches de votre application, vous obtenez l'assurance que votre code exécute et produit des résultats corrects.

Edit: Je dois souligner que la possibilité de comparer deux types, qui ne dépendent pas des noms de méthodes jusqu'à la dernière seconde, etc. sont des caractéristiques principales de Ruby.

Vous n'appelez pas une méthode autant que vous envoyez un message à un objet. L'objet est alors responsable de la détermination de la manière de gérer la méthode. Dans les rails, il est utilisé pour accéder aux colonnes de DB à Activerecord. Il n'y a pas de méthodes pour les colonnes jusqu'à ce qu'un message avec le nom de la colonne soit envoyé à l'objet.

Le typage statique de Ruby va à l'encontre du système de typage du canard. On peut souvent obtenir le polymorphisme gratuitement sans vous soucier des systèmes d'héritage / d'interface complexes.

Je suggère d'embrasser ces fonctionnalités et de compenser l'incertitude grâce à des tests


0 commentaires

1
votes

Ruby n'est pas censé être en sécurité. Cela vous permet de comparer deux objets, et c'est là qu'une grande partie de son pouvoir vient de. Les rails ne seraient pas possibles sans une telle conception dynamique.

même une langue compilée, telle que Java ou C, ne vous empêchera pas de faire == sur deux objets. Comme Ben dit, il est préférable de tester d'abord. Inspectez les structures avec qui vous travaillez. Une façon d'obtenir des informations sur un objet Ruby est d'utiliser: xxx


2 commentaires

P objet, videra une version plus détaillée d'un objet. Mélanger P et Met est généralement un gagnant pour obtenir des informations de débogage.


Oui. Imprimer est mon outil de débogage de choix. Vous pouvez également utiliser ./script/console pour accéder aux objets de manière interactive.



1
votes

En général, la meilleure façon (je sais) pour éviter ce type de problème pour les langages dynamiques / scripts consiste à déplacer "logique" sur méthodes / commandes et tests d'unité d'écriture pour eux. Fondamentalement, tout ce qui peut échouer devrait être testé. Le code sur la page doit être logique muet ... Plutôt que d'afficher uniquement les éléments qui répondent à un certain critère, il devrait afficher tous les éléments et obtenir cette liste d'éléments d'une méthode qui ne renvoie que celles qui doivent être affichées. < / p>


0 commentaires

2
votes

Ruby ne vous permet pas de redéfinir l'opérateur == pour un objet. Dans Ruby 1.8, vous ne pouvez pas, Ruby 1.9 était censé faire, mais je n'ai pas pu obtenir mon script travailler pour les classes de base. Cela fonctionne bien pour des objets définis personnalisés.

class Object

  alias :equal_without_warning :==

  def ==(object)
    unless self.class == object.class
      warn("Comparing `#{self.class}' with `#{object.class}'")
    end
    equal_without_warning(object)
  end

end


1 commentaires

Vous devrez faire la même redéfinition pour les classes principales depuis qu'ils redéfinissent normalement == sans référence à l'objet # ==



0
votes

Deux choses que je suggère:

Un: lisez sur IRB (ou script / console pour rails). Une pratique de développement commune dans les langues dynamiques est d'essayer des extraits de code à l'intérieur d'un interprète «en direct» (comme IRB ou la console de rails). Cette pratique remonte aux premières langues dynamiques comme Smalltalk et Lisp. Ruby-Debrug est également très utile pour les problèmes de dépannage et aurait été un moyen très facile de comprendre l'erreur dans votre exemple.

Deux: Lisez sur «Typage du canard». "Types" et les variables fonctionnent un peu différemment dans RUBY que beaucoup de gens s'y attendent. Si je comprends bien, une variable comme User.ID n'a pas de "type". La valeur pointée sur par user.id a un type, mais la variable elle-même ne le fait pas. Je crois que cela fait partie de la raison pour laquelle il n'y a pas d'outil qui vous aurait dit quelle est votre erreur avant d'exécuter le programme. Comparer ces deux variables n'est pas une erreur car les variables n'ont pas de type. user.id indiquait un entier à ce moment-là dans votre programme, mais il serait parfaitement légal d'attribuer à l'utilisateur. : -)


1 commentaires

Il n'y a pas non plus de raison pour laquelle vous ne pouvez pas comparer deux types différents avec == .



0
votes

La meilleure solution que j'ai trouvée était un IDE qui a fait la vérification de la syntaxe à la volée, telle que la rubymine. Je ne suis pas sûr que cela aurait résolu mon problème initial, mais cela m'a aidé à trouver et à réparer plusieurs autres erreurs de syntaxe et compilez. Merci à tous pour vos suggestions.


0 commentaires