terça-feira, 13 de novembro de 2012

Adicionando e removendo ações de um roteamento REST em Rails

Dando continuidade ao estudo de roteamento com Rails introduzido no post anterior, vou mostrar como é possível adicionar ações a um roteamento REST, indo além das sete definidas por padrão, e também como fazer para remover alguma das operações padrão quando esta realmente não for necessária em sua aplicação.



Adicionando ações


No post anterior não cheguei a apresentar o código de um controlador RESTful criado pelo Rails, mas, omitindo o conteúdo das ações, sua estrutura fica basicamente assim:

class PessoasController < ApplicationController
  
  def show
    ...
  end

  def new
    ...
  end

  def index
    ...
  end

  def create
    ...
  end

  def edit
    ...
  end

  def update
    ...
  end

  def destroy
    ...
  end
end


Quando o arquivo de configuração config/routes.rb inclui a linha resources :pessoas, estas sete ações são automaticamente mapeadas pelo Rails, cada uma para um path e um método HTTP específico. Veja o post anterior para maiores detalhes.

Porém pode haver situações em que se deseja ter mais ações além das sete predefinidas. A configuração de roteamento terá então dois formatos, sendo um para quando a nova ação aplicar-se a um elemento específico de nosso resource e o outro para quando aplicar-se à coleção geral.

Quando a nova ação aplicar-se a um elemento específico, o método empregado é o member:
resources :pessoas do
  member do
    post :duplicar
  end
end


Observe na linha 2 o método member sendo invocado com a passagem de um bloco onde, na linha 3, o método post indica que através de uma requisição HTTP POST o método duplicar de nosso controlador deverá ser invocado.
A nova ação duplicar pode então ser acessada através do helper automaticamente disponibilizado para uso na camada view:
<%= button_to 'Duplicar', duplicar_pessoa_path(@pessoa) %>


Quando a nova ação aplicar-se à coleção geral, o método empregado é o collection:
resources :pessoas do
  collection do
    get :pesquisar
  end

  member do
    post :duplicar
  end
end


Observe que dessa vez na linha 2 o método collection é invocado com a passagem de um bloco onde, na linha 3, o método get indica que através de uma requisição HTTP GET o método pesquisar de nosso controlador deverá ser invocado. Sendo uma requisição GET, o acesso pode ser feito pelo path /pessoas/pesquisar.

Outra forma mais compacta de definir os dois novos roteamentos seria assim:
resources :pessoas do
  get 'pesquisar', on: :collection
  post 'duplicar', on: :member
end



Removendo ações



Conforme mencionado no início, pode haver situações em que não são necessárias as sete operações criadas por padrão pelo Rails. Poder removê-las é importante, não só por remover código desnecessário de sua aplicação, mas por ter menos pontos de acesso para se preocupar com segurança, etc. Por isso, é bem recomendado que as ações desnecessárias sejam removidas.

Como de costume, a forma de realizar isso em Rails é bastante simples:

resources :pessoas, except: [:edit, :update]

Auto-explicativo! E se a quantidade de ações a serem descartadas for maior que a quantidade das que devem ser disponibilizadas, é preferível utilizar only em vez de except:
resources :pessoas, only: [:show]



Então, neste post apresentei mais algumas possibilidades bem úteis e interessantes da configuração de roteamento em Rails. Para maiores detalhes continuo recomendando a referência oficial disponível em http://guides.rubyonrails.org/routing.html e o livro Rails Recipes, capítulos 23 e 25.

Até a próxima!


Nenhum comentário:

Postar um comentário