A tentativa do ActiveSupport não gosta do método Ruby_missing

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_missinge tryjogar 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.