mergulhao.info
Por Sylvestre Mergulhão
Sylvestre Mergulhão é programador web e fundador da HE:labs.
Veja também minhas palestras no Speaker Deck e me acompanhe no twitter @smergulhao.
Problema ao usar resources com palavras sem plural
Postado em 23/01/2009
No V2V nós criamos um resource que é utilizado para o formulário de contato (formmail) do site. O nome do resource é contact_us. O nosso routes.rb ficava assim:
map.resources :contact_us
E temos uma configuração de inflector para informar ao Rails que essa é uma expressão incontável:
ActiveSupport::Inflector.inflections do |inflect|
inflect.uncountable %w(contact_us)
end
O problema é que ao tentar gerar a url com o método contact_us_url para o formulário acontece o seguinte erro:
contact_us_url failed to generate from {:controller=>"contact_us", :action=>"show"} - you may have ambiguous routes, or you may need to supply additional parameters for this route. content_url has the following required parameters: ["contact_us", :id] - are they all satisfied?
Isso acontece pois o Rails sobrescreve o método que gera a url da coleção com o método que gera a url de instância dos objetos. Para resolver isso temos que informar no arquivo de rotas o nome que será utilizado nos métodos no caso de ser uma instância e não uma coleção:
map.resources :contact_us, :singular => :contact_us_item
Isso fará os métodos ficarem assim:
contact_us_path() => /contact_us
new_contact_us_item_path() => /contact_us/new
contact_us_item_path(1) => /contact_us/1
edit_contact_us_item_path(1) => /contact_us/1
Reparem que no caso de não ser usada a opção :singular o método de acesso a coleção e da instância ficam com nomes iguais:
contact_us_path() => /contact_us
contact_us_path(1) => /contact_us/1
Isso não acontece com expressões normais pois o Rails utiliza para a coleção a expressão com pluralize. Supondo que o nosso resource fosse de posts, os métodos seriam:
posts_path() => /posts
new_post_path() => /posts/new
post_path(1) => /posts/1
edit_post_path(1) => /posts/1