组织 Rails 控制器索引的最佳方式

Best way to organize Rails controller index

提问人:dwayne 提问时间:6/7/2021 更新时间:6/7/2021 访问量:47

问:

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

然后我们添加了另一种类型的步入式,然后是另一种......因此,现在我们的 #index 行动必须在四种不同的步入式类型之间进行过滤,有时还会以不同的方式对待它们。

其他 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

因此,我会为初始步入的 #index 操作创建 等,我将为其余资源保留顶级。WalkIns::InitialWalkInsControllerWalkInsController

但是由于命名空间与顶级控制器相同-- --我不能这样做,因为 Rails 会将其视为并说它找不到 ID 为“show”的 WalkIn。walk-inswalk_ins/initialwalk_ins#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 控制器 命名空间

评论


答:

1赞 Lam Phan 6/7/2021 #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

评论

0赞 dwayne 6/7/2021
是的,谢谢!我非常确信我将需要命名空间,我忘记了直接将路由添加到集合中。