2010-09-08 20 views
33

Sé que podría escribir fácilmente una función y ponerla en el controlador de la aplicación, pero preferiría no hacerlo si ya hay algo más que lo hace. Básicamente quiero tener algo como:Rieles (o Ruby): Sí/No en lugar de Verdadero/Falso

>> boolean_variable? 
=> true 
>> boolean_variable?.yesno 
=> yes 
>> boolean_variable?.yesno.capitalize 
=> Yes 

¿hay algo como esto en el marco de Rails?

+0

http://stackoverflow.com/questions/15047745/how-to-implement-yes-no-instead-of-boolean-for-certain-cases-in-rails – Hugo

Respuesta

35

No existe tal ayudante incorporado, pero es trivialmente fácil de implementar:

class TrueClass 
    def yesno 
    "Yes" 
    end 
end 

class FalseClass 
    def yesno 
    "No" 
    end 
end 
+1

Oye, eso es más astuto de lo que me hubiera surgido. En lo que respecta a la aplicación de rieles, ¿cuál sería el mejor lugar para poner este código? en un archivo bajo lib o algo? – DJTripleThreat

+0

Crearía un inicializador personalizado en la ruta de configuración/inicializador llamado "boolean_path.rb". De esta forma, estos nuevos métodos estarían disponibles a través de la aplicación. ¡Aclamaciones! – Eytan

+1

@Eytan Soy nuevo en Ruby and Rails y estoy tratando de seguir con las convenciones, pero no sé cómo crear un intializador, ¿me pueden ayudar con eso? Básicamente, ¿qué pondría en ese boolean_path.rb y cómo puedo usarlo? Lo que me gustaría hacer es cuando creo mi modelo, me gustaría usar t.boolean_yesno en lugar de booleano regular y tener esa salida Sí o No en lugar de Verdadero o Falso. Si prefieres, abro otra pregunta para esto, házmelo saber. – GiH

14

Como alternativa, también se puede hacer una offs en sus puntos de vista tales como:

<%= item.bool_field? ? 'yes' : 'no' %> 
+1

Esto no es muy SECO, en comparación con la otra solución y será difícil de localizar. –

+5

No, Jeff, tienes toda la razón. Hablaba con * one * offs, y no con * many * offs, y en el caso de este último, un ayudante sería, por supuesto, la opción más sabia (y DRY), como usted señala. – patrickhawley

+0

¡Perfecto! Tengo una aplicación de formulario único, por lo que no me importa la localización/DRY (todavía). Gracias por eso. –

34

Hay ISN' algo en Rails.

Una mejor manera de añadir a las verdaderas clases/falso para lograr algo similar sería hacer un método en el ApplicationHelper:

def human_boolean(boolean) 
    boolean ? 'Yes' : 'No' 
end 

Luego, en su opinión

<%= human_boolean(boolean_youre_checking) %> 

métodos Agregando las clases integradas generalmente son mal vistas. Además, este enfoque se ajusta estrechamente a los ayudantes de Rails como raw().

Además, uno no es una gran idea ya que no se puede mantener (o probar) fácilmente.

+0

Hizo exactamente eso. ¡Gracias! –

20

No es una joya para eso: humanize_boolean

A continuación, sólo hacer:

true.humanize # => "Yes" 
false.humanize # => "No" 

También es compatible con la internacionalización para que pueda cambiar fácilmente la cadena devuelta por incluyendo su traducción para en.boolean. Sí y en.boolean.no (o cualquier localidad que desee)

+1

+1 ¡Gracias, Mike! – DJTripleThreat

11

la gema humanize_boolean extiende el TrueClass, FalseClass y NilClass que es una extensión que indirecta preferiría evitar.

he encontrado esta ayuda con una traducción de nivel superior está aislado, amable a cambiar y se puede dar nada Truthy o Falsey-:

# app/helpers/application_helper.rb 
class ApplicationHelper 
    def humanize_boolean(boolean) 
    I18n.t((!!boolean).to_s) 
    end 
end 

# config/locales/en.yml 
en: 
    :true: 'Yes' 
    :false: 'No' 

Haciendo !!(boolean).to_s asegura las variables pasadas al argumento es o bien una "true" o "false" valor al compilar la cadena de traducción.

En uso:

# app/views/chalets/show.html.erb 
<%= humanize_boolean(chalet.rentable?) %> 
Cuestiones relacionadas