HE:labs

Postado por Rodrigo Reginato Marques em 26/02/2013

Scoped route com a gem friendly_id

Quando participei do desenvolvimento do projeto clubedomenu.com, um sistema voltado para delivery de comida, foi feito pensando exclusivamente para a cidade de Londrina. Recentemente surgiu a necessidade de expandir o sistema para outras localidades. Feito um estudo das funcionalidades existentes.

Foi visto que as urls do sistema foram contruídas dessa forma:

1 clubedomenu.com/nome_do_restaurante

Agora é preciso que a url seja montada dessa forma, para distinguir os restaurantes por cidade:

1 clubedomenu.com.br/nome_da_cidade/nome_do_restaurante

Além disso pode acontecer casos onde 2 restaurantes em diferentes cidades com o mesmo slug nome_do_restaurante. Como isso pode acontecer? Muito simples, basta a mesma empresa ter uma matriz e uma filial com o mesmo nome em cidades diferentes.

Desde o começo do projeto foi adotado a gem friendly_id que transforma as urls em uma forma mais amigável.

Para resolver o problema de franquia de restaurantes em cidades diferentes com o mesmo slug a gem oferece essa solução:

1 friendly_id :nome_do_campo_restaurante, :use => :scoped, :scope => :nome_do_campo_cidade.
2 validates_uniqueness_of :nome_do_campo_restaurante, :scope => :city

Dessa forma é possível obter urls assim.

1 clubedomenu.com.br/nome_da_cidade_1/nome_do_restaurante
2 clubedomenu.com.br/nome_da_cidade_2/nome_do_restaurante

Aqui está um teste que prova que é possível ter subdomínios iguais em cidades diferentes.

1 describe "scoped city" do
2     let!(:restaurant_1) { FactoryGirl.create(:restaurant, name: "Pizzaria Boa", city: "Maringa", subdomain: "veneza") }
3     let!(:restaurant_2) { FactoryGirl.create(:restaurant, name: "Pizzaria Boa", city: "Londrina", subdomain: "veneza") }
4     it "should repeat slug scoped by city", :vcr do
5       restaurant_1.to_param.should eq("veneza")
6       restaurant_2.to_param.should eq("veneza")
7     end
8 end

Twitter @reginato

Comentários
Included file post/disqus_thread.html not found in _includes directory