【问题标题】:Custom action route inheritance in RailsRails 中的自定义动作路由继承
【发布时间】:2020-12-28 09:34:37
【问题描述】:

我有以下控制器继承链(注意模型不继承,而是有父子关系):EmployeesController < SitesController < CompaniesController

我有一个子类继承的动作companies#dashboard。现在这是我的路线:

  get "/company/dashboard(/:disguised_id)" => "companies#dashboard"
    get "/site/dashboard(/:disguised_id)" => "sites#dashboard"
      get "/employee/dashboard(/:disguised_id)" => "employees#dashboard"

但我想知道是否有更优雅的方式来为自定义操作设置此继承链?

【问题讨论】:

  • 你想用这个继承链解决什么问题?
  • 更干燥,例如,如果我在某个时候更改了确切的路由路径,我希望在所有控制器中以完全相同的方式更改它(当然,控制器名称的显示方式不同)跨度>
  • 您可以通过routes.rb 做到这一点,无需任何继承,路由非常可配置,无需对控制器进行任何更改。

标签: ruby-on-rails inheritance routes


【解决方案1】:

您可以使用routing concerns 重用路由集:

Rails.application.routes.draw do

  concern :dashboard do
    get '/dashboard(/:disguised_id)', action: :dashboard
  end

  scope :company, controller: :companies do
    concerns :dashboard
  end

  scope :site, controller: :sites do
    concerns :dashboard
  end

  scope :employee, controller: :employees do
    concerns :dashboard
  end
end

问题可以包含在scopenamespaceresourceresources。这里更好的解决方案是将命名空间与单独的仪表板控制器一起使用:

Rails.application.routes.draw do
  concern :dashboard do
    get '/dashboard(/:disguised_id)', to: 'dashboard#show'
  end

  namespace :companies, path: 'company' do
    concerns :dashboard
  end

  namespace :sites, path: 'site' do
    concerns :dashboard
  end

  namespace :employees, path: 'employee' do
    concerns :dashboard
  end
end

这让您可以从已经负责对资源进行 CRUD 处理的普通控制器卸载责任并使用继承:

class DashboardController < ApplicationController
  def show
    # do something awesome
  end
end
module Companies
  class DashboardController < ::DashboardController 
  end
end
module Sites
  class DashboardController < ::DashboardController 
  end
end
module Employees
  class DashboardController < ::DashboardController 
  end
end

【讨论】:

  • 除此之外,只需记住路由只是一种 DSL,而不是像 YML 或 XML 这样的声明性配置格式。如果您需要进行更复杂的路由,您可以使用方法甚至将您的路由烘焙到模块中。
【解决方案2】:

我猜你想做什么,只是 DRY 路线,不是吗?

如果只有 3 个资源的唯一路线,您可能会更容易做到这一点。假设它是“pages#dashboard”。所以你需要带有仪表板的页面控制器。我使用页面控制器来登录页面、常见问题解答、仪表板等。所以这些是通常永远不会改变的静态路由。因为我不会删除仪表板、登录页面或常见问题解答部分。

然后在仪表板中,您可以根据资源呈现 company_dashboard、site_dashboard 或 employee_dashboard。

最后,你可能在路线中有唯一的路径,或者这样做:

get "/dashboard", to: "pages#dashboard"

当然,您可以使用“index”创建另一个控制器“仪表板”,并在那里提供逻辑。但是因为我不知道你的代码或未来的设计理念,所以我可能会为我提供最简单的解决方案是错误的。但我的意思是,您可能不需要 3 个不同的仪表板控制器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2011-01-17
    相关资源
    最近更新 更多