如何生成正确的“url_for”嵌套资源



我正在使用Ruby on Rails 3.2.2,我想为嵌套资源生成一个正确的url_for URL。也就是说,我有:

# 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

注意:生成的命名路由类似于article_user_associationsarticle_user_associationedit_article_user_association、...

在我看来,我使用:

url_for([@article, @article_association])

然后我收到以下错误:

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

但是,如果我以这种方式声明路由器

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

url_for方法按预期工作,例如,它会生成 URL /articles/1/user_associations/1

注意:在这种情况下,生成的命名路由类似于article_articles_user_associationsarticle_articles_user_associationedit_article_articles_user_association、...

但是,我认为在后者/工作案例中构建/命名路由器的方式并不"好"。那么,是否有可能以某种方式通过生成像article_user_association这样的命名路由(而不是像article_articles_user_association)来使url_for方法工作?


我阅读了与ActionDispatch::Routing::UrlFor方法相关的官方文档(特别是"命名路由的 URL 生成"部分),但找不到解决方案。也许有一种方法可以向 Rails "说"使用特定的命名路由器,就像您想使用 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

您的UserAssociation模型位于 Articles 命名空间中,该命名空间包含在命名路由中:

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

如果删除命名空间,将获得要查找的路由帮助程序:

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

除非您有充分的理由将UserAssociation保存在命名空间中,否则请不要这样做。

相关内容

  • 没有找到相关文章

最新更新