适用范围资源的Rails路由设计问题

时间:2019-05-09 16:13:23

标签: ruby-on-rails routes

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可能没有意义。

0 个答案:

没有答案