2010-08-20 5 views
24

J'ai un champ DB qui est de type entier et les valeurs sont toujours 0 ou 1. Comment saisir la valeur booléenne équivalente dans ruby? de telle sorte que quand je fais ce qui suit la case à cocher est correctement définie:ruby ​​entier à booléen

<%= check_box_tag 'resend', @system_config.resend %> 

Répondre

44

Vous pouvez utiliser la méthode zero?. Il renvoie vrai si 0. Si vous avez besoin de revenir en arrière, vous pouvez facilement annuler [email protected]_config.resend.zero?. Ou vous pouvez étendre la classe Fixnum, en ajoutant une méthode to_b?, puisque tout est ouvert et extensible dans les langages dynamiques.

class Integer 
    def to_b? 
    !self.zero? 
    end 
end 

alt text

API Ruby: http://ruby-doc.org/core/classes/Fixnum.html#M001050

+0

Merci Jarret. Une partie de ma solution consistait également à utiliser correctement l'aide check_box_tag comme ceci: <% = check_box_tag 'resend', @ system_config.resend, @ system_config.resend%> – Rafael

+1

Notez qu'il y a aussi ['nonzero?'] (Http: //ruby-doc.org/core-1.9.3/Numeric.html#method-i-nonzero-3F) qui peut lire mieux que '! zero?'. –

+6

Avez-vous intentionnellement créé l'invite de commande des couleurs BSoD? – NullVoxPopuli

9

1 est votre seule valeur de vérité ici. Vous pouvez donc obtenir la valeur de la valeur booléenne avec number == 1.

+0

Peut-être que cela pourrait être formulé plus clairement, je pensais presque que vous vouliez dire que c'était ruby ​​standard. - une solution compatible avec la norme, qui correspond à la question réelle –

+0

@Simon B .: Je ne suis pas sûr de ce que ma réponse se ems "non standard" pour vous. Les deux méthodes '==' et 'zéro?' Sont standard Ruby. Mais il se trouve que 'number == 1' lit plus clairement que'! Number.zero? 'IMO. – Chuck

+0

Dans ruby, les deux 0 et 1 sont "véridiques", donc en fait il n'y a aucune chance de répondre ici à la fois "standard" et répondre à la question. Pardon. Peut-être que je ferais mieux d'essayer d'obtenir ceci dans le texte ou le titre de question. Tous ceux qui viennent ici chercher "casting de type ruby-fidèle" de Fixnum à Boolean seront sinon confus de toute façon. En outre, selon http://drawingablank.me/blog/ruby-boolean-typecasting.html est semble !! est la seule option ruby-fidèle. Ce qui n'est pas une option dans la question ci-dessus. –

2

J'ai eu le même problème et a traité de cette façon:

def to_boolean(var) 
case var 
     when true,'true',1,'1' 
     return true 
     when false, 'false',0,'0' 
     return false 
end 
end 

Cela fonctionne avec les formes, bases de données et les gens qui ne connaissent pas ruby. Je l'ai trouvé particulièrement utile avec Rails, puisque les paramètres sont souvent passés/interprétés comme des chaînes et je ne veux pas m'inquiéter à ce sujet.

+2

L'indentation ici est non standard. Forme plus simple serait def to_boolean (valeur) ['true', 1, '1', true] .include? (Valeur) fin –