2010-11-19 19 views
1

Plusieurs de mes partiels peuvent être rendus dans deux "modes". Si full_display est false, je ne rends pas plusieurs champs. Pour rendre les choses faciles, je voulais faire un des "modes" par défaut - si full_display n'est pas défini, traitez-le comme false. Je suis venu avec ce code:Création d'aides de portée dynamique dans Rails

(((not defined?(full_display).nil?) && full_display) || false) 

Beaucoup de choses à se déplacer. Ce serait bien de le mettre à l'intérieur d'une aide ou de quelque chose, mais puisque Ruby n'a qu'une portée lexicale, je ne vois pas de bonne façon de le faire.

Les mauvaises idées que je l'ai déjà essayé:

  • sur le dessus de la partie et faire <% display = long code that is above %> utiliser l'affichage dans le code, mais la création de variables locales dans une vue semble mauvaise et doit être copié dans tous les partiel en utilisant full_display.
  • envelopper dans une chaîne, le mettre dans une aide et utiliser eval (display_helper) dans la vue, mais évidemment cela crée des problèmes de sécurité.

Répondre

2

C'est tout à fait une façon alambiquée de dire quelque chose d'aussi simple que:

defined?(full_display) && full_display 

Dans Ruby il y a deux valeurs qui ne sont pas vrai, nil et false, tous les autres évaluent comme vrai, qui comprend 0 , chaîne vide, entre autres, qui serait autrement évaluée comme false en Perl, PHP et C. Test avec .nil? est généralement réservé aux rares cas où vous voulez faire la différence entre false et undefined, ce qui est parfois le cas avec les champs booléens où une valeur manquante est différente d'une valeur false.

Dans tous les cas, dans l'espace de vue, il est beaucoup plus facile d'attribuer les valeurs par défaut en utilisant le ou égal à l'opérateur ||= comme ceci:

<% full_display ||= false %> 

Cela équivaut à full_display = full_display || false. Cela fait deux choses. Tout d'abord, il définit la variable full_display même s'il n'a pas été créé précédemment, et deuxièmement, il s'assure qu'il contiendra une valeur au moins égale à false, jamais indéfinie.

Vous verrez le modèle ||= default beaucoup dans le code Ruby car c'est un moyen facile d'assigner quelque chose dans le cas où ce sera nil sinon.

+0

C'est beaucoup mieux que mon code, merci! Avoir des assistants de portée dynamique serait encore mieux (et plus puissant) cependant. –