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.