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:手工生成的路由与使用资源创建的路由具有不同的前缀的主要内容,如果未能解决你的问题,请参考以下文章
rails 使用 friendly_id gem 按资源名称路由访问