Carlos Brando

Nome do Jogo

Edge Rails: render_component

O método render_component já havia sido marcado como deprecated em versões anteriores do Rails, mas na versão 2.3 ele será totalmente removido do framework.

Este método tem a finalidade de fazer com que uma outra action renderize a action em execução. É meio complicado de explicar, então vamos aos famosos exemplos:

class WeblogController < ActionController::Base
  # Performs a method and then lets hello_world output its render
  def delegate_action
    do_other_stuff_before_hello_world

    render_component :controller => "greeter",
      :action => "hello_world",
      :params => { :person => "david" }
  end
end

class GreeterController < ActionController::Base
  def hello_world
    render :text => "#{params[:person]} says, Hello World!"
  end
end

No exemplo acima estou executando a action delegate_action, mas estou fazendo uso do método render_component para que a resposta da minha action seja criada pela action hello_world que está em um outro controller.

Um outro uso mais prático deste recurso, é usá-lo de dentro de uma view:

<%= render_component :controller => "greeter", :action => "hello_world" %>

Neste caso o render_component agiria como se eu estivesse chamando um partial, quando na verdade estou executando uma action em um controller.

Por que um método tão legal está sendo removido do Rails? A resposta é muito simples: ele é muito lento e tem a mania de deixar as coisas um pouco confusas. Partials e filtros podem ser usados para a mesma finalidade e oferecem uma performance muito melhor, além de mais clareza ao código.

Se ainda assim, você desejar usar render_component ou se já está usando e deseja migrar seu projeto, foi criado um plugin que devolve esta funcionalidade ao Rails.


Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.3/3.0 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades acompanhando a série Edge Rails.

Comments