Como ya sabe la firma de los métodos deseados, podría ser mejor definirlos en lugar de usar method_missing
. Puede hacerlo así (dentro de ti definición de clase):
[:bill_date, :registration_date, :some_other_date].each do |attr|
define_method("#{attr}_human") do
(send(attr) || Date.today).strftime('%b %d, %Y')
end
define_method("#{attr}_human=") do |date_string|
self.send "#{attr}=", Date.strptime(date_string, '%b %d, %Y')
end
end
Si una lista de todos los atributos de fecha no es un problema de este enfoque es mejor, ya que se trata de métodos regulares en lugar de un poco de magia en el interior method_missing
.
Si desea aplicar eso a todos los atributos que tienen nombres que terminan con _date
puede recuperarlos como que (dentro de su definición de clase):
column_names.grep(/_date$/)
Y aquí es method_missing
solución (no probado, aunque el anterior uno no se prueba tampoco):
def method_missing(method_name, *args, &block)
# delegate to superclass if you're not handling that method_name
return super unless /^(.*)_date(=?)/ =~ method_name
# after match we have attribute name in $1 captured group and '' or '=' in $2
if $2.blank?
(send($1) || Date.today).strftime('%b %d, %Y')
else
self.send "#{$1}=", Date.strptime(args[0], '%b %d, %Y')
end
end
Además es bueno para anular respond_to?
método y volver true
de nombres de métodos, que se maneja dentro method_missing
(en 1.9 debe reemplazar respond_to_missing?
en su lugar).
'method_missing' es la última gota que debe tomar. En realidad, definir los métodos es mucho más limpio, conduce a un mejor diseño del código con una clara separación de las preocupaciones, es mucho más fácil de entender y también más rápido. Entonces, si puedes definir tus métodos, siempre debes hacerlo. –
Como aprendí de KL-7, hay mejores enfoques que la falta de método, pero teniendo en cuenta que tengo 4 atributos de fecha diferentes para este modelo, la definición manual de cada uno no es la solución. DRY – tybro0103
Bueno, el método de KL-7 es realmente el preferido aquí. Porque él está proponiendo exactamente lo que también quise decir: definir los métodos. –