【问题标题】:How to properly make Rails routes with multiple optional segments?如何正确制作具有多个可选段的 Rails 路线?
【发布时间】:2016-01-03 22:01:28
【问题描述】:

在使用 Rails 4 应用程序时,我多次偶然发现以下问题:

假设我有一个模型,Task

  • 任务可以有不同的状态,例如openin progressclosed
  • 任务可以有不同的优先级,例如normalhighcritical

现在,我想为每种可能性显示一个任务列表。因此,在我的 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


【解决方案1】:

您可以如下定义路径:

get "list/(:priority)/(:status)", action: :index, on: :collection, as: :list

这里list_tasks_path(priority: :high) 将返回正确的路径[/tasks/list/high],params[:status] 将是null

【讨论】:

    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多