Come già si conosce la firma dei metodi desiderati, potrebbe essere preferibile definirli invece di utilizzare method_missing
. Si può fare così (dentro di te definizione di classe):
[: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
Se messa in vendita di tutti gli attributi di data non è un problema di questo approccio è meglio come avete a che fare con i metodi normali, invece di qualche magia all'interno method_missing
.
Se si desidera applicare che a tutti gli attributi che hanno nomi che terminano con _date
loro è possibile recuperare così (all'interno della vostra definizione di classe):
column_names.grep(/_date$/)
Ed ecco method_missing
soluzione (non testato, anche se il precedente non è testato né):
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
Inoltre è bello per ignorare respond_to?
metodo e tornare true
per i nomi dei metodi, che si maniglia interna method_missing
(in 1.9 si dovrebbe sostituire invece respond_to_missing?
).
fonte
2012-01-16 20:29:01
'method_missing' è l'ultima goccia che dovresti prendere. In realtà, la definizione dei metodi è molto più pulita, porta a una migliore progettazione del codice con una chiara separazione delle preoccupazioni, è molto più facile da capire e anche più veloce. Quindi se puoi definire i tuoi metodi, dovresti sempre farlo. –
Come appreso da KL-7 ci sono approcci migliori rispetto a method_missing, ma considerando che ho 4 diversi attributi di data per questo modello, la definizione manuale di ognuno non è la soluzione. DRY – tybro0103
Bene, il metodo di KL-7 è in realtà il preferito qui. Perché sta proponendo esattamente ciò che volevo dire: definire i metodi. –