Digamos que temos o seguinte código em user.rb para ajudar na autorização:
def method_missing(method_name, *args, &block)
if action = method_name[/^can_(.*)?$/, 1]
@can_do.include?(action)
else
super
end
end
E nós o utilizamos assim:
if @current_user.try(:can_publish_post?)
@post.publish!
end
Bem … Isso não vai funcionar.
Veja, a tentativa do ActiveSupport está enviando uma chamada de método público para o objeto ao qual é chamado apenas se o objeto responder a esse método . Em outras palavras, se quisermos method_missing
e try
jogar bem, precisamos de um pouco mais de graxa em nosso user.rb:
def respond_to?(method_name, *args, &block)
method_name =~ /^can_.*?$/ or super
end
Dessa forma, nosso modelo de usuário permitirá que outras pessoas saibam que ele pode realmente responder @cat.try(:can_i_haz_cheezburger?)
.
PS : esta é uma mudança de trilhos pós-3.2, está apenas no master agora, mas tropecei nela acidentalmente e pensei em compartilhar.