rails formularios anidados ruby-on-rails ruby ruby-on-rails-3 routing named-routing

ruby on rails - formularios - ¿Cómo generar el `url_for` apropiado para un recurso anidado?



rails formularios (1)

Estoy usando Ruby on Rails 3.2.2 y me gustaría generar una url_for URL adecuada para un recurso anidado. Es decir, tengo:

# config/routes.rb resources :articles do resources :user_associations end # app/models/article.rb class Article < ActiveRecord::Base ... end # app/models/articles/user_association.rb class Articles::UserAssociation < ActiveRecord::Base ... end

Nota : las rutas con nombre generadas son como article_user_associations , article_user_association , edit_article_user_association , ...

Cuando en mi opinión uso:

url_for([@article, @article_association])

Entonces me sale el siguiente error:

NoMethodError undefined method `article_articles_user_association_path'' for #<#<Class:0x000...>

Sin embargo, si declaro los enrutadores de esta manera

# config/routes.rb resources :articles do resources :user_associations, :as => :articles_user_associations end

el método url_for funciona como se esperaba y genera, por ejemplo, la URL /articles/1/user_associations/1 .

Nota : en este caso, las rutas con nombre generadas son como article_articles_user_associations , article_articles_user_association , edit_article_articles_user_association , ...

Sin embargo, creo que no es "bueno" la forma en que se construyen / nombran los enrutadores en el último / caso de trabajo. Entonces, ¿ es posible de algún modo hacer que el método url_for funcione generando rutas con nombre como article_user_association (y no como article_articles_user_association )?

Leí la Documentación oficial relacionada con el ActionDispatch::Routing::UrlFor (en particular, la sección "Generación de URL para rutas con nombre"), pero no puedo encontrar una solución. Tal vez haya una manera de "decir" a Rails que use un enrutador con nombre específico, como lo hace cuando quiere cambiar la columna de la clave principal de una tabla con la declaración self.primary_key ...

# app/models/articles/user_association.rb class Articles::UserAssociation < ActiveRecord::Base # self.primary_key = ''a_column_name'' self.named_router = ''user_association'' ... end


Su modelo de UserAssociation está en el espacio de nombres de Articles , que se incluye en la ruta nombrada:

# app/models/articles/user_association.rb class Articles::UserAssociation < ActiveRecord::Base ... end # route => articles_user_association # nested route => article_articles_user_association

Si elimina el espacio de nombres, obtendrá el asistente de ruta que está buscando:

# app/models/articles/user_association.rb class UserAssociation < ActiveRecord::Base ... end # route => user_association # nested route => article_user_association

A menos que tenga una buena razón para mantener UserAssociation en un espacio de nombres, no lo haga.