【问题标题】:Best way to organize Rails controller index组织 Rails 控制器索引的最佳方法
【发布时间】:2021-08-24 03:19:49
【问题描述】:

我们的应用可以跟踪未经预约就走进我们诊所的客户。我们从一个简单的 WalkIn 模型和 WalkInsController 开始。

然后我们添加了另一种类型的walk-in,然后又添加了另一种......所以现在我们的#index 操作必须在四种不同的walk-in 类型之间进行过滤,并且有时对它们进行不同的处理。

其他 REST 操作(#show 除外)在类型之间基本相同,但可能有一些细微差别。我们还有一些非 REST 方法并不适合其他任何地方。

因此,至少需要驯服此 #index 操作。

第一个想法:我将命名空间 walk_ins 仅用于#index:

namespace :walk_ins do
  get 'clinic'      => 'clinic_walk_ins#index',      :as => :clinic
  get 'group'       => 'group_walk_ins#index',       :as => :group
  get 'assessment'  => 'assessment_walk_ins#index',  :as => :assessment
  get 'initial'     => 'initial_walk_ins#index',     :as => :initial
end

resources :walk_ins, except: [ :index ] do
  member do
    get :eligible_initial_appointments
    patch :mark_follow_up_as_completed
  end
  collection do
    get :follow_up_due
  end
end

所以我会创建WalkIns::InitialWalkInsController 等,用于初始访问的#index 操作,我将保留顶级WalkInsController 用于其余资源。

但是由于命名空间与顶级控制器相同 -- walk-ins -- 我不能这样做 walk_ins/initial,因为 Rails 会将其视为 walk_ins#show 并说它找不到 WalkIn ID 为“show”。

我可以简单地更改命名空间的名称,但walk_ins 确实最有意义。

第二遍——将所有资源路由嵌入到命名空间中:

namespace :walk_ins do
  get 'clinic'      => 'clinic_walk_ins#index',      :as => :clinic
  get 'group'       => 'group_walk_ins#index',       :as => :group
  get 'assessment'  => 'assessment_walk_ins#index',  :as => :assessment
  get 'initial'     => 'initial_walk_ins#index',     :as => :initial

  resources :walk_ins, except: [ :index ] do
    member do
      get :eligible_initial_appointments
      patch :mark_follow_up_as_completed
    end
    collection do
      get :follow_up_due
    end
  end
end

这很有效,并且为每种类型的 walk_in#index 配备一个离散控制器真是太好了。

但是现在每个不是索引的资源都必须在 walk_ins/walk_ins 内。

例如,要编辑 WalkIn 3,URL 为:

/walk_ins/walk_ins/3/edit

这似乎......不是我想要的。

最好的组织方式是什么?

【问题讨论】:

    标签: ruby-on-rails controller namespaces


    【解决方案1】:

    您可以像这样将所有 walk_ins 过滤器移动到集合块内

    resources :walk_ins, except: [ :index ] do
     member do
      get :eligible_initial_appointments
      patch :mark_follow_up_as_completed
     end
    
     collection do
      get :follow_up_due
      get 'clinic', controller: 'walk_ins/clinic_walk_ins', action: 'index', as: 'clinic'
      get 'group', controller: 'walk_ins/group_walk_ins', action: 'index', as: 'group'
      get 'assessment', controller: 'walk_ins/assessment_walk_ins', action: 'index', as: 'assessment'
      get 'initial', controller: 'walk_ins/initial_walk_ins', action: 'index', as: 'initial'
     end
    end
    

    【讨论】:

    • 好的,谢谢!我非常确信我需要命名空间,我忘了直接将路由添加到集合中。
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多