Digamos que temos uma classe onde temos 3 métodos:
class Messages
def draft
@status = :draft
end
def posted
@status = :posted
end
def deleted
@status = :deleted
end
end
Como podemos ver, os três métodos estão apenas atualizando o valor de nossa variável de instância ‘@status’, podemos refatorar isso tirando vantagem do método define , primeiro precisamos criar um array de estados e iterar por ele, então dentro do bloco chame o método define para criar dinamicamente nossos métodos como:
class Messages
states = [:draft, :posted, :deleted]
states.each do |state|
define_method state do
@status = state
end
end
end
Lá vamos nós, muito mais limpo e executado exatamente da mesma forma, agora se quisermos criar novos métodos, só precisamos adicioná-los ao array de estados, espero que seja útil.