Une ligne si l'instruction ne fonctionne pas


192
<%if @item.rigged %>Yes<%else%>No<%end%>

Je pensais à quelque chose comme ça?

if @item.rigged ? "Yes" : "No" 

Mais ça ne marche pas. Ruby a le ||=mais je ne sais même pas comment utiliser cette chose.


On ne sait pas quelle ligne ne fonctionne pas (ou est-ce les deux?)
Ymoreau

Réponses:


401

Retirer ifdeif @item.rigged ? "Yes" : "No"

L'opérateur ternaire a la forme condition ? if_true : if_false


1
Si votre condition se termine par un '?' est-il possible de le laisser tomber? Ie si la condition est @ customer.sales.present? pouvez-vous laisser tomber le «?»? ... ne vous inquiétez pas. J'ai trouvé du code et je l'ai testé. La réponse est `` non ''
Jay Killeen

@JayKilleen Vous avez raison. Ruby est une question de trucs intelligents, mais c'est aussi intelligent (:
Nikita Rybak

1
@NikitaRybak s/that/not that :)
Austin

180

Dans Ruby, la condition et la thenpartie d'une ifexpression doivent être séparées soit par un séparateur d'expression (c'est ;-à- dire ou une nouvelle ligne), soit par le thenmot - clé.

Donc, tout cela fonctionnerait:

if @item.rigged then 'Yes' else 'No' end

if @item.rigged; 'Yes' else 'No' end

if @item.rigged
  'Yes' else 'No' end

Il existe également un opérateur conditionnel dans Ruby, mais c'est totalement inutile. L'opérateur conditionnel est nécessaire en C, car c'est un opérateur: en C, ifest une instruction et ne peut donc pas renvoyer de valeur, donc si vous voulez renvoyer une valeur, vous devez utiliser quelque chose qui peut renvoyer une valeur. Et les seules choses en C qui peuvent renvoyer une valeur sont les fonctions et les opérateurs, et comme il est impossible de créer ifune fonction en C, vous avez besoin d'un opérateur.

En Ruby, cependant, ifest une expression. En fait, tout est une expression dans Ruby, donc il peut déjà renvoyer une valeur. Il n'est même pas nécessaire que l'opérateur conditionnel existe , encore moins de l'utiliser.

BTW: il est habituel de nommer les méthodes utilisées pour poser une question avec un point d'interrogation à la fin, comme ceci:

@item.rigged?

Cela montre un autre problème avec l'utilisation de l'opérateur conditionnel dans Ruby:

@item.rigged? ? 'Yes' : 'No'

C'est tout simplement difficile à lire avec les multiples points d'interrogation qui se rapprochent les uns des autres.


74

Une ligne si:

<statement> if <condition>

Ton cas:

"Yes" if @item.rigged

"No" if !@item.rigged # or: "No" unless @item.rigged

14
Ou "No" unless @item.riggedpour éviter le!
Veger

Cette solution est différente en ce qu'elle retourne nilau lieu de 'Yes'if item.riggedest vrai. Une seule ligne si ou à moins que les instructions retournent nilsi la condition n'est pas remplie.
The Pellmeister

23

De ce que je sais

3 monoplaces

  1. a = 10 if <condition>

exemple:

a = 10 if true # a = 10
b = 10 if false # b = nil
  1. a = 10 unless <condition>

exemple:

a = 10 unless false # a = 10
b = 10 unless true # b = nil
  1. a = <condition> ? <a> : <b>

exemple:

a = true ? 10 : 100 # a = 10
a = false ? 10 : 100 # a = 100

J'espère que cela aide.


2
Chien C'est la meilleure réponse - j'aime la façon dont il contraste succinctement entre les trois manières. Merci!
MrVocabulary

7

Les constructions à une ligne shell et C fonctionnent toutes les deux (ruby 1.9.3p429):

# Shell format
irb(main):022:0> true && "Yes" || "No"
=> "Yes"
irb(main):023:0> false && "Yes" || "No"
=> "No"

# C format
irb(main):024:0> true ? "Yes" : "No"
=> "Yes"
irb(main):025:0> false ? "Yes" : "No"
=> "No"

seul le deuxième exemple est le rubis idiomatique
sekmo

7

sinon, la condition peut être couverte par l'opérateur ternaire

@item.rigged? ? 'Yes' : 'No'

2

Pour plus de simplicité, si vous devez utiliser par défaut une valeur nulle, vous pouvez utiliser:

@something.nil? = "No" || "Yes"

1

Vous pouvez utiliser ----

(@ item.rigged)? "Oui Non"

Si @ item.rigged est vrai, il renverra 'Oui' sinon il renverra 'Non'

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.