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.


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


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.


74

Una línea si:

<statement> if <condition>

Tu caso:

"Yes" if @item.rigged

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

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.


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"

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'

2

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

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

1

Puedes usar ----

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.