Una línea si la declaración no funciona

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

Estaba pensando en algo como esto?

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

Pero no funciona. Ruby tiene el ||=pero ni siquiera estoy seguro de cómo usar esa cosa.

RoR
fuente
No está claro qué línea no está funcionando (o se trata de ambas cosas?)
ymoreau

Respuestas:

399

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

El operador ternario tiene forma condition ? if_true : if_false

Nikita Rybak
fuente
1
Si su condición termina en un '?' ¿es posible dejarlo caer? Es decir, si la condición es @ customer.sales.present? ¿Puedes soltar el '?' ... no te preocupes. Encontré un código que tenía y lo probé. La respuesta es 'no'
Jay Killeen
@ JayKilleen Estás en lo correcto. Ruby es todo acerca de trucos inteligentes, pero es que inteligente (:
Nikita Rybak
1
@NikitaRybak s/that/not that :)
Austin
180

En Ruby, la condición y la thenparte de una ifexpresión deben estar separadas por un separador de expresión (es decir, ;o una nueva línea) o la thenpalabra clave.

Entonces, todo esto funcionaría:

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

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

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

También hay un operador condicional en Ruby, pero eso es completamente innecesario. El operador condicional es necesario en C, porque es un operador: en C, ifes una declaración y, por lo tanto, no puede devolver un valor, por lo que si desea devolver un valor, debe usar algo que pueda devolver un valor. Y las únicas cosas en C que pueden devolver un valor son funciones y operadores, y dado que es imposible hacer ifuna función en C, necesita un operador.

En Ruby, sin embargo, ifes una expresión. De hecho, todo es una expresión en Ruby, por lo que ya puede devolver un valor. No hay ninguna necesidad de que el operador condicional para siquiera existen , y mucho menos usarlo.

Por cierto: es costumbre nombrar los métodos que se utilizan para hacer una pregunta con un signo de interrogación al final, como este:

@item.rigged?

Esto muestra otro problema con el uso del operador condicional en Ruby:

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

Simplemente es difícil de leer con los múltiples signos de interrogación que están cerca uno del otro.

Jörg W Mittag
fuente
74

Una línea si:

<statement> if <condition>

Tu caso:

"Yes" if @item.rigged

"No" if !@item.rigged # or: "No" unless @item.rigged
Bakir Jusufbegovic
fuente
14
O "No" unless @item.riggedpara evitar el!
Veger
Esta solución es diferente en el sentido de que devuelve en nillugar de 'Yes'si item.riggedes verdadero. Línea simple si o a menos que las declaraciones regresen nilsi no se cumple la condición.
The Pellmeister
23

Por lo que sé

3 líneas simples

  1. a = 10 if <condition>

ejemplo:

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

ejemplo:

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

ejemplo:

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

Espero que ayude.

Alan Dong
fuente
2
Perro Esta es la mejor respuesta: me encanta cuán sucintamente contrasta las tres formas. ¡Gracias!
MrVocabulary
7

Tanto las construcciones de shell y C de una línea funcionan (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"
marca
fuente
solo el segundo ejemplo es el rubí idiomático
sekmo
7

de lo contrario, la condición se puede cubrir con un operador ternario

@item.rigged? ? 'Yes' : 'No'
nitanshu verma
fuente
2

Para simplificar, si necesita establecer un valor predeterminado si es nulo, puede usar:

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

Puedes usar ----

(@ item.rigged)? "Sí No"

Si @ item.rigged es verdadero, devolverá 'Sí'; de lo contrario, devolverá 'No'

Snm Maurya
fuente