2012-04-28 5 views
9

En una vista de rieles, se puede utilizar try a la salida sólo si hay un valor en la base de datos, por ejemploCómo encadenar try() y scop to_s() en Rails?

@model.try(:date) 

y una cadena lata trys si, por ejemplo, se necesita la salida como una cadena

@model.try(:date).try(:to_s) 

¿Pero y si necesito llamar a un formato del alcance? Lo intenté

@model.try(:date).try(:to_s(:long)) 
@model.try(:date).try(:to_s).try(:long) 

¿Cuál es la sintaxis correcta para esto? ¿Y cuál es una buena referencia para más explicación?

Gracias

Respuesta

14

Desde el fine manual:

try (* a, b) &
[...]
try argumentos también acepta y/o un bloque, para el método que está intentando

Person.try(:find, 1) 

Así que creo que quiere:

@model.try(:date).try(:to_s, :long) 

Ésta no funcionará:

@model.try(:date).try(:to_s(:long)) 

debido a que está tratando de acceder al símbolo :to_s como método (:to_s(:long)). Éste no funcionará:

@model.try(:date).try(:to_s).try(:long) 

porque usted está tratando de llamar al método long en qué to_s devoluciones y es probable que no tienen un método String#long definido.

+0

spot on! ¡Gracias! –

4

mu is too short's answer muestra el uso correcto para el método try con parámetros:

@model.try(:date).try(:to_s, :long) 

Sin embargo, si está utilizando Rubí 2.3 o posterior, debe dejar de usar try y dar al operador de la navegación segura de un intento (sin juego de palabras mejor dicho):

@model&.date&.to_s(:long) 

la siguiente respuesta está aquí con fines históricos - la adición de un rescue nil al final de las sentencias es considéré d mala práctica, ya que suprime todas las excepciones:

Para las cadenas largas que pueden fallar, yo prefiero usar:

@model.date.to_s(:long) rescue nil 

En lugar de llenar mi punto de vista con try(...) llamadas.

Además, trate de usar I18n.localize para el formato de fecha, así:

l @model.date, format: :long rescue nil 

Ver: http://rails-bestpractices.com/posts/42-use-i18n-localize-for-date-time-formating

+0

Gracias Fabio, esta es información realmente útil. Aprendí algo nuevo. –

+2

evite el rescate nulo a menos que esté 120% seguro de que no se está perdiendo ningún otro error y tampoco le importa el rendimiento (aumentar excepciones es lento) –

+1

Tiene razón, @SimonB. Lamentablemente, no lo sabía cuando publiqué la respuesta, en 2012. Lo he editado, gracias por notarlo. –

2

En caso de que se utilice con frecuencia tratan cadenas sin bloques, una opción es extender la Clase de objeto:

class Object 
    def try_chain(*args) 
    args.inject(self) do |result, method| 
     result.try(method) 
    end 
    end 
end 

Y luego simplemente use @model.try_chain(:date, :to_s)

Cuestiones relacionadas