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.

RoR
la source
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

Nikita Rybak
la source
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.

Jörg W Mittag
la source
74

Une ligne si:

<statement> if <condition>

Ton cas:

"Yes" if @item.rigged

"No" if !@item.rigged # or: "No" unless @item.rigged
Bakir Jusufbegovic
la source
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.

Alan Dong
la source
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"
marque
la source
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'
nitanshu verma
la source
2

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

@something.nil? = "No" || "Yes"
aabiro
la source
1

Vous pouvez utiliser ----

(@ item.rigged)? "Oui Non"

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

Snm Maurya
la source