Problema ao usar resources com palavras sem plural
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
22.01.2009 11:46 PM





January 23rd, 2009 at 10:30 AM
contact_us é apenas um formulário de contato ou possui new, index, edit, update (as actions rest do rails)?
Se for só um form eu sempre uso uma rota nomeada para esse caso.
map.contact_us ”/contact_us”, :controller=>:static_pages, :action=>:contact_us
Ou talvez, como contact_us provavelmente é só um na aplicação toda você pode usar um resource singular …
January 27th, 2009 at 11:18 PM
Daniel,
Ele só possui create e new na verdade, mas eu mantive a api rest. Realmente nesse caso não era necessário. Sim, usar resource no singular nesse caso também é uma solução. Pelo menos valeu para explicar o problema de criar resources que são uncontable ;)