【发布时间】:2016-01-03 22:01:28
【问题描述】:
在使用 Rails 4 应用程序时,我多次偶然发现以下问题:
假设我有一个模型,Task。
- 任务可以有不同的状态,例如
open、in progress或closed。 - 任务可以有不同的优先级,例如
normal、high、critical。
现在,我想为每种可能性显示一个任务列表。因此,在我的 Routes 文件中,我创建了以下内容:
resources :tasks do
get "status/:status", action: :index, on: :collection, as: :status_list
get "priority/:priority", action: :index, on: :collection, as: :priority_list
end
index 操作检查 params[:status] 是否存在,如果存在,则过滤任务集合以仅使用具有给定状态的任务集合。它还检查tag 参数,并将任务集合过滤为仅具有给定优先级的任务集合。
但是,我想结合这两种过滤方式(以不使用 GET 参数的方式)。
这是我尝试过的:
resources :tasks do
get "list/(:status/(:priority))", action: :index, on: :collection, as: :list
end
但是,这有以下问题:当尝试使用仅具有优先级的路径助手时,例如调用list_tasks_path(priority: :high) 时,生成的URL 将恢复为tasks/list,因为缺少URL 段。
这个问题也可以通过为这种情况添加一个只有优先级的路由来缓解,但是每次我想要在两者之间切换链接时,我都需要在我的视图中放置一个 if 语句。
如何正确解决这个问题?有没有更好的方法来做到这一点?
【问题讨论】:
-
在我看来,你让你的路线做的比他们应该做的更多。对于
GETing 任务,我只有一条路由,并且在您的控制器中完成过滤逻辑 -
当您说“以不使用 GET 参数的方式”时,您是在说您不想让它变得平静?
-
@CristianoAlencar:据我所知,像
/tasks/list/open/high这样的路径以/tasks?status=open&priority=high的方式嵌套,我认为它会更符合REST,但我可能错了。
标签: ruby-on-rails routing