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

2 Responses to “Problema ao usar resources com palavras sem plural”

  1. Daniel Lopes Says:

    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 …

  2. Sylvestre Mergulhão Says:

    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 ;)

Deixe seu comentário