首页 > 解决方案 > Rails 中的自定义动作路由继承

问题描述

我有以下控制器继承链(请注意,模型不继承,而是具有父子关系):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"

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

标签: ruby-on-railsinheritanceroutes

解决方案


您可以使用路由问题来重用路由集:

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

推荐阅读