Rails中范围资源的首选路由和名称空间控制器方案是什么。即。用于计划的项目的索引:
1)/计划/项目
2)/ projects / scheduled
3)/ projects?scheduled = true
选项1是我们现有代码库的工作方式,访问资源的每个新功能都有其自己的名称空间。但似乎选项2也有可能。
在使用足够多的控制器和大量控制器的Rails代码库中寻找意见的人。
选项1:作用域是名称空间
scheduled / projects => Scheduled / projects#index
namespace :scheduled do
resources :projects
end
resources :projects
/projects/3
bin/rails g controller projects
class ProjectsController < ApplicationController
def show
render plain: "show projects/#{params[:id]}"
end
end
/scheduled/projects
bin/rails g controller scheduled/projects
class Scheduled::ProjectsController < ApplicationController
def index
render plain: 'index scheduled/projects'
end
end
优点: 所有计划的项目都分组在一个文件夹下,类似于https://guides.rubyonrails.org/v5.2/routing.html中的管理路由范围设定示例。
缺点: 各种作用域的ProjectsController分散在不同的位置。
选项2-在资源之后指定的范围
projects / scheduled => projects / scheduled#index
namespace :projects do
resources :scheduled
end
# config/routes.rb
resources :projects
/projects/3
bin/rails g controller projects
class ProjectsController < ApplicationController
def show
render plain: "show projects/#{params[:id]}"
end
end
/projects/scheduled
bin/rails g controller projects/scheduled
class Projects::ScheduledController < ApplicationController
def index
render plain: 'index projects/scheduled'
end
end
命名空间方案类似于其中的Inboxes :: PendingController示例。http://jeromedalbert.com/how-dhh-organizes-his-rails-controllers/
收件箱是类似于项目的资源 待定状态是预定状态
优点:与之相关的所有项目都在同一个名称空间下,可以更轻松地共享诸如过滤逻辑之类的东西
缺点:项目/计划的索引路径可能看起来类似于projects /:id的显示路径,其计划为:id
选项3-范围是查询参数
/ projects?scheduled = true => projects / scheduled#index
使用提前约束将查询参数映射到路线。
优点:所有与项目相关的路线都是/ projects
缺点:也许并非所有过滤器都适用于特定范围的资源。即。 / projects?scheduled = true&filter [status] = false可能没有意义。