【问题标题】:How to name nested controllers and routes?如何命名嵌套的控制器和路由?
【发布时间】:2017-09-25 19:22:16
【问题描述】:

我正在与以下组织一起从头开始创建一个 wiki 应用程序:

主控制器:Wiki 嵌套控制器:WikiCategories 嵌套控制器:WikiArticles

在我的 config/routes.rb 我有:

resource :wiki do
  resources :wiki_categories, :as => :categories
  resources :wiki_articles, :as => :articles
end

我选择将类别和文章控制器命名为 WikiCategories 和 WikiArticles,以区别于我希望将来在博客嵌套下创建的其他类别和文章控制器。

这给了我以下路线:

/wiki/wiki_categories/new
/wiki/wiki_articles/new

有什么办法可以将路由改写为:

/wiki/categories/new
/wiki/articles/new

...仍然使用 WikiCategories 和 WikiArticles 控制器名称?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    我选择将类别和文章控制器命名为 WikiCategories 和 WikiArticles,以区别于我希望将来在博客嵌套下创建的其他类别和文章控制器。

    IMO,您似乎有点违反惯例。正如Controller Namespaces and Routing 中所讨论的,为什么不这样做:

    namespace :wiki do
      resources :categories, :articles
    end
    

    这会给你:

        wiki_categories GET    /wiki/categories(.:format)              wiki/categories#index
                        POST   /wiki/categories(.:format)              wiki/categories#create
      new_wiki_category GET    /wiki/categories/new(.:format)          wiki/categories#new
     edit_wiki_category GET    /wiki/categories/:id/edit(.:format)     wiki/categories#edit
          wiki_category GET    /wiki/categories/:id(.:format)          wiki/categories#show
                        PATCH  /wiki/categories/:id(.:format)          wiki/categories#update
                        PUT    /wiki/categories/:id(.:format)          wiki/categories#update
                        DELETE /wiki/categories/:id(.:format)          wiki/categories#destroy
          wiki_articles GET    /wiki/articles(.:format)                wiki/articles#index
                        POST   /wiki/articles(.:format)                wiki/articles#create
       new_wiki_article GET    /wiki/articles/new(.:format)            wiki/articles#new
      edit_wiki_article GET    /wiki/articles/:id/edit(.:format)       wiki/articles#edit
           wiki_article GET    /wiki/articles/:id(.:format)            wiki/articles#show
                        PATCH  /wiki/articles/:id(.:format)            wiki/articles#update
                        PUT    /wiki/articles/:id(.:format)            wiki/articles#update
                        DELETE /wiki/articles/:id(.:format)            wiki/articles#destroy
    

    然后,创建命名空间控制器,例如:

    app/controllers/wiki/categories.rb
    
    class Wiki::CategoriesController < ApplicationController
      ...
    end
    

    app/controllers/wiki/articles.rb
    
    class Wiki::ArticlesController < ApplicationController
      ...
    end
    

    【讨论】:

    • 当然是更干净优雅的问题解决方案。
    【解决方案2】:

    是的,通过指定controller,资源可以随心所欲地命名。

    resource :wiki do
      resources :categories, controller: 'wiki_categories'
      resources :articles, controller: 'wiki_articles'
    end
    

    请参阅the guide 了解更多信息。

    【讨论】:

    • 太棒了。谢谢你。我正在通过指南寻找正确的选项,但不记得它叫什么。谢谢!
    【解决方案3】:

    您可以使用path: 选项,如下所示:

    resource :wiki do
      resources :wiki_categories, path: 'categories', :as => :categories
      resources :wiki_articles, path: 'articles', :as => :articles
    end
    

    这会给你:

    /wiki/categories/...
    /wiki/articles/...
    

    有关详细信息,请参阅指南的Translated Paths 部分。

    【讨论】:

    • 谢谢!这行得通,但“控制器”规范更简洁,是我正在寻找的:资源:类别,控制器:“wiki_categories”感谢帮助。
    猜你喜欢
    • 2012-05-14
    • 2023-03-08
    • 2019-12-12
    • 1970-01-01
    • 2013-02-03
    • 2013-01-23
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多