如何正确定义 Rails 路由,以便资源的某些操作转到一个控制器而另一些转到另一个控制器?
How to properly define Rails routes so that some actions of a resource go to one controller and some go to another?
我的应用有 products
、categories
和 subcategries
。我在 url /dash
有一个管理界面来编辑这些细节。我试着像这样设置 urls :
- url
/dash/products
下的产品创建、更新、销毁和索引
- 产品显示在
/products/porduct-code
下
- 类别显示在
/category-name
下
/dash/editcategories
下的类别编辑列表指向操作 editcategories
- 子类别显示在
category-name/subcategory-name
下
- 编辑也在上面的分类下
- 类别和子类别在
/dash
下创建、更新、删除和索引
当我试图修复一件东西时,另一件坏了。我的整个路线文件变得一团糟。试图修复它们,但无法正常工作。这是我的路线文件:
Rails.application.routes.draw do
# Pages
root 'pages#home'
get 'terms' => 'pages#termsandconditions'
get 'delivery-charges' => 'pages#deliverycharges'
get 'search' => 'pages#search'
get 'deals' => 'pages#alldeals'
get 'contact', to: 'pages#contact'
post 'contact', to: 'pages#contactscreate'
get 'dealslist' => 'pages#dealslist'
get 'cart' => 'carts#cart'
get 'rate' => 'districtrates#rate'
get 'deliverycharges' => 'districtrates#deliverycharges'
get 'pricecalc' => 'pages#pricecalc'
# Devise routes
# Others
resources :users
resources :brands
resources :orders
get 'dash/subcategorylist' => 'products#subcategorylist'
get 'dash' => 'dash#index'
get '/products/:id', to: 'pages#product'
scope '/dash' do
resources :districtrates, as: 'deliveryrates'
resources :slides
resources :images
resources :colorqtys
resources :products
get 'imagelist' => 'images#imagelist'
get 'slidelist' => 'slides#slidelist'
get 'update_deliveryrates' => 'districtrates#update_deliveryrates'
get 'adminlogs' => 'logs#adminlogs'
end
get '/:id', to: 'categories#show'
scope '/dash' do
get 'editcategories' => 'categories#edit_categories'
end
scope '/:id' do
get '/:id', to: 'subcategories#show'
end
resources :categories, path: '/dash/category' do
get 'editsubcategories' => 'subcategories#edit_subcategories'
end
get 'dash/category/new' => 'categories#new'
post 'dash/categories' => 'categories#create'
delete 'dash/category/:id' => 'categories#destroy'
patch 'dash/category/:id' => 'categories#update'
get 'dash/subcategory/new' => 'subcategories#new'
post 'dash/subcategories' => 'subcategories#create'
delete 'dash/subcategory/:id' => 'subcategories#destroy'
patch 'dash/subcategory/:id' => 'subcategories#update'
get 'dash/colors' => 'colors#index'
post 'dash/saveimages' => 'images#saveimages'
post 'dash/savecolorqtys' => 'colorqtys#savecolorqtys'
end
请帮助我解决冲突问题并清理我的路由文件。也请给我一个很好的指导来理解 Rails 路线。
REST über alles:
只需坚持 rails REST 约定,就可以清除路由文件中的大部分问题。这也应该提高应用程序的一致性。我相信在很多情况下,您只是为了获得短网址而妥协了应用程序的设计。
在 '/'
"namespace" 中放置许多路由,例如 '/about'
、'/faq'
等对于小型站点或如果您正在构建主要处理单一类型的资源(如 Todo 应用程序)。但是,当您拥有多种类型的资源和相当多的复杂性时,它会导致设计非常薄弱。
将您的每项资源放入其自己的小盒子(/users
、/pets
)中可以形成良好的 RESTful 接口并降低复杂性以及路由歧义和冲突的风险。
此外,在命名资源时,您应该使用 snake_case 以提高可读性:
resources :districtrates # bad
resources :district_rates # better
让我们开始重构:
get 'contact', to: 'pages#contact'
post 'contact', to: 'pages#contactscreate'
在 PagesController 中安装一些 "static" 路由并创建路由 "manually" 没问题。但这真的很奇怪,因为 Contract 实际上可以更安静地建模。
创建一个ContactsController
并将路由定义更改为:
resources :contacts, only: [:new, :create]
# GET /contacts/new
# POST /contacts
如果你绝对必须有一个 /contact
路径:
get 'contact', to: 'contacts#new'
# But don't create that POST route!
接受相同治疗的其他候选人是 dealslist
、deliverycharges
。
管理界面:
我认为您应该完全接受 "on page editing"(使用标准控制器、路由和视图)或者拥有一个带有自己的控制器和视图的管理命名空间。
因此您需要更改路由定义以使用 Dash
命名空间。
namespace :dash
resources :slides
resources :images
resources :products
# ...
get 'imagelist' => 'images#imagelist' # BAD. Use images#index instead
get 'slidelist' => 'slides#slidelist' # BAD. Use slides#index instead
end
这将路由到 Dash::ImagesController
。使用关注点(mixins)作为横切复制的方法。
类别和子类别可以改为嵌套。
namespace :dash
resources :categories do
resources :categories, as: 'sub_categories', controller: 'dash/categories'
end
end
加法:
public类:
resources :categories, only: [:show] do
resources :categories,
as: 'sub_categories',
controller: 'categories',
only: [:show]
end
我的应用有 products
、categories
和 subcategries
。我在 url /dash
有一个管理界面来编辑这些细节。我试着像这样设置 urls :
- url
/dash/products
下的产品创建、更新、销毁和索引
- 产品显示在
/products/porduct-code
下
- 类别显示在
/category-name
下
/dash/editcategories
下的类别编辑列表指向操作editcategories
- 子类别显示在
category-name/subcategory-name
下
- 编辑也在上面的分类下
- 类别和子类别在
/dash
下创建、更新、删除和索引
当我试图修复一件东西时,另一件坏了。我的整个路线文件变得一团糟。试图修复它们,但无法正常工作。这是我的路线文件:
Rails.application.routes.draw do
# Pages
root 'pages#home'
get 'terms' => 'pages#termsandconditions'
get 'delivery-charges' => 'pages#deliverycharges'
get 'search' => 'pages#search'
get 'deals' => 'pages#alldeals'
get 'contact', to: 'pages#contact'
post 'contact', to: 'pages#contactscreate'
get 'dealslist' => 'pages#dealslist'
get 'cart' => 'carts#cart'
get 'rate' => 'districtrates#rate'
get 'deliverycharges' => 'districtrates#deliverycharges'
get 'pricecalc' => 'pages#pricecalc'
# Devise routes
# Others
resources :users
resources :brands
resources :orders
get 'dash/subcategorylist' => 'products#subcategorylist'
get 'dash' => 'dash#index'
get '/products/:id', to: 'pages#product'
scope '/dash' do
resources :districtrates, as: 'deliveryrates'
resources :slides
resources :images
resources :colorqtys
resources :products
get 'imagelist' => 'images#imagelist'
get 'slidelist' => 'slides#slidelist'
get 'update_deliveryrates' => 'districtrates#update_deliveryrates'
get 'adminlogs' => 'logs#adminlogs'
end
get '/:id', to: 'categories#show'
scope '/dash' do
get 'editcategories' => 'categories#edit_categories'
end
scope '/:id' do
get '/:id', to: 'subcategories#show'
end
resources :categories, path: '/dash/category' do
get 'editsubcategories' => 'subcategories#edit_subcategories'
end
get 'dash/category/new' => 'categories#new'
post 'dash/categories' => 'categories#create'
delete 'dash/category/:id' => 'categories#destroy'
patch 'dash/category/:id' => 'categories#update'
get 'dash/subcategory/new' => 'subcategories#new'
post 'dash/subcategories' => 'subcategories#create'
delete 'dash/subcategory/:id' => 'subcategories#destroy'
patch 'dash/subcategory/:id' => 'subcategories#update'
get 'dash/colors' => 'colors#index'
post 'dash/saveimages' => 'images#saveimages'
post 'dash/savecolorqtys' => 'colorqtys#savecolorqtys'
end
请帮助我解决冲突问题并清理我的路由文件。也请给我一个很好的指导来理解 Rails 路线。
REST über alles:
只需坚持 rails REST 约定,就可以清除路由文件中的大部分问题。这也应该提高应用程序的一致性。我相信在很多情况下,您只是为了获得短网址而妥协了应用程序的设计。
在 '/'
"namespace" 中放置许多路由,例如 '/about'
、'/faq'
等对于小型站点或如果您正在构建主要处理单一类型的资源(如 Todo 应用程序)。但是,当您拥有多种类型的资源和相当多的复杂性时,它会导致设计非常薄弱。
将您的每项资源放入其自己的小盒子(/users
、/pets
)中可以形成良好的 RESTful 接口并降低复杂性以及路由歧义和冲突的风险。
此外,在命名资源时,您应该使用 snake_case 以提高可读性:
resources :districtrates # bad
resources :district_rates # better
让我们开始重构:
get 'contact', to: 'pages#contact'
post 'contact', to: 'pages#contactscreate'
在 PagesController 中安装一些 "static" 路由并创建路由 "manually" 没问题。但这真的很奇怪,因为 Contract 实际上可以更安静地建模。
创建一个ContactsController
并将路由定义更改为:
resources :contacts, only: [:new, :create]
# GET /contacts/new
# POST /contacts
如果你绝对必须有一个 /contact
路径:
get 'contact', to: 'contacts#new'
# But don't create that POST route!
接受相同治疗的其他候选人是 dealslist
、deliverycharges
。
管理界面:
我认为您应该完全接受 "on page editing"(使用标准控制器、路由和视图)或者拥有一个带有自己的控制器和视图的管理命名空间。
因此您需要更改路由定义以使用 Dash
命名空间。
namespace :dash
resources :slides
resources :images
resources :products
# ...
get 'imagelist' => 'images#imagelist' # BAD. Use images#index instead
get 'slidelist' => 'slides#slidelist' # BAD. Use slides#index instead
end
这将路由到 Dash::ImagesController
。使用关注点(mixins)作为横切复制的方法。
类别和子类别可以改为嵌套。
namespace :dash
resources :categories do
resources :categories, as: 'sub_categories', controller: 'dash/categories'
end
end
加法:
public类:
resources :categories, only: [:show] do
resources :categories,
as: 'sub_categories',
controller: 'categories',
only: [:show]
end