Rails:手工生成的路由与使用资源创建的路由具有不同的前缀

Posted

技术标签:

【中文标题】Rails:手工生成的路由与使用资源创建的路由具有不同的前缀【英文标题】:Rails: routes generated by hand have different prefix from those created with resources 【发布时间】:2016-11-07 11:07:58 【问题描述】:

我想手动创建 rails 路线,而不是使用自动的resource :tasks(这只是一个练习,一旦我理解了这一点,我将回到使用资源:tasks)。

我 /think/ 我有正确的语法,但是当我手动编写路由时生成的前缀 (path_helpers) 是错误的。为什么,我做错了什么?

这是我的代码:

Rails.application.routes.draw do
      root to: 'tasks#index'
      get 'tasks', to: 'tasks#index'
      get 'tasks/:id', to: 'tasks#show'
      get 'tasks/new', to: 'tasks#new'
      post 'tasks', to: 'tasks#create'
      get 'tasks/:id/edit', to: 'tasks#edit'
      patch 'tasks/:id', to: 'tasks#update'
      delete 'tasks/:id', to: 'tasks#destroy'
end

这是我在终端中调用 rails routes 时它创建的路由和前缀:

   Prefix Verb   URI Pattern               Controller#Action
     root GET    /                         tasks#index
    tasks GET    /tasks(.:format)          tasks#index
          GET    /tasks/:id(.:format)      tasks#show
tasks_new GET    /tasks/new(.:format)      tasks#new
          POST   /tasks(.:format)          tasks#create
          GET    /tasks/:id/edit(.:format) tasks#edit
          PATCH  /tasks/:id(.:format)      tasks#update
          DELETE /tasks/:id(.:format)      tasks#destroy

这是我使用resource :tasks时得到的结果

   Prefix Verb   URI Pattern               Controller#Action
    tasks GET    /tasks(.:format)          tasks#index
          POST   /tasks(.:format)          tasks#create
 new_task GET    /tasks/new(.:format)      tasks#new
edit_task GET    /tasks/:id/edit(.:format) tasks#edit
     task GET    /tasks/:id(.:format)      tasks#show
          PATCH  /tasks/:id(.:format)      tasks#update
          PUT    /tasks/:id(.:format)      tasks#update
          DELETE /tasks/:id(.:format)      tasks#destroy

编辑:

回答几个答案:我知道我可以使用“as”来命名前缀,但我认为在这种情况下我不应该这样做。 据我了解,“as”仅在您想将标准前缀更改为个性化前缀的情况下使用,或者如果您认为您的路线将来可能会发生变化并且您不想冒险与您的助手打交道.我仍然应该在不使用“as”的情况下获得正确的前缀。 但是在这里,带有 get 方法的前缀 tasks_new 都链接到 tasks#new 和 tasks#edit 方法,我认为这是不正确的。

【问题讨论】:

作为一个小插件,如果你想在开发过程中跟踪你的路由和前缀,你可以添加这个 gem:rubygems.org/gems/restful_routing 【参考方案1】:

Rails 可让您命名路线。例如:

get 'tasks/new', to: 'tasks#new', as: :new_task

【讨论】:

我知道我可以使用'as'来命名路线,但我认为在这种情况下我不应该这样做。据我了解,“as”仅在您想将标准前缀更改为个性化前缀的情况下使用,或者如果您认为您的路线将来可能会改变并且您不想冒险与您的助手打交道.我仍然应该在不使用“as”的情况下获得正确的前缀。不过在这里,get 方法的前缀 tasks_new 都链接到 tasks#new 和 tasks#edit 方法,我认为这是不对的。 但是你应该使用resources。您期望 rails 解析每个 get 方法,以防它转到控制器中的新方法。如果你有get 'tasks/something', to: 'tasks#new' 应该是new_task_path 还是something_task_path。这会增加 imo 的开销,没有明显的好处 我知道。正如我在问题开始时所说,“这只是一个练习,一旦我理解了这一点,我将回到使用资源:任务”。虽然它可能效率不高,但它应该仍然有效,所以我试图理解为什么它没有。 因为rails不解析get,所以默认是"#controller_name_#controller_action"【参考方案2】:

使用 as 来命名路线。 编写代码如下:

Rails.application.routes.draw do
      root 'tasks#index'
      get 'tasks' => 'tasks#index', as: 'task_list'
      get 'tasks/:id' => 'tasks#show', as: 'display_task'
      get 'tasks/new' => 'tasks#new', as: 'task_new'
      post 'tasks' => 'tasks#create', as: 'task_create
      get 'tasks/:id/edit' => 'tasks#edit', as: 'task_edit'
      patch 'tasks/:id', to: 'tasks#update'
      delete 'tasks/:id', to: 'tasks#destroy'
end

【讨论】:

我知道我可以使用'as'来命名路线,但我认为在这种情况下我不应该这样做。据我了解,“as”仅在您想将标准前缀更改为个性化前缀的情况下使用,或者如果您认为您的路线将来可能会改变并且您不想冒险与您的助手打交道.我仍然应该在不使用“as”的情况下获得正确的前缀。不过在这里,get 方法的前缀 tasks_new 都链接到 tasks#new 和 tasks#edit 方法,我认为这是不对的。

以上是关于Rails:手工生成的路由与使用资源创建的路由具有不同的前缀的主要内容,如果未能解决你的问题,请参考以下文章

6--Rails架构中的资源2

如何限制 Rails 路由文件中的资源格式

Rails 资源路由缺少参数但匹配文档

rails 使用 friendly_id gem 按资源名称路由访问

我可以通过资源方法在 Ruby on Rails 应用程序中使用排除项设置路由吗?

Rails 路由:将自定义路由添加到标准操作列表