为其他新操作添加路由的目的是什么?

时间:2015-12-14 16:20:03

标签: ruby-on-rails rest routing

指南 Rails路由来自Outside In 在第2章中有一个名为Adding Routes for Additional New Actions的部分,资源路由:Rails默认,这个例子:< / p>

resources :comments do
  get 'preview', on: :new
end

生成以下路线:

             Prefix Verb   URI Pattern                     Controller#Action
preview_new_comment GET    /comments/new/preview(.:format) comments#preview

至少在另外两种方式中可以实现相同的结果:

1)在resources :comments get 'new/preview', to: :preview, on: :collection内添加收集路由(如果您不关心路由名称)

2)将此路线添加到相应的单一资源:

resource :comment, only: :preview do
  get 'new/preview', to: :preview, as: 'preview_new', on: :collection
end

具有完全相同的行为。

那么为什么有on: :new选项呢?这只是一条捷径吗?如果是,为什么它仅适用于“新操作”,而其他默认REST操作没有任何类似选项,例如on: :editon: :delete

2 个答案:

答案 0 :(得分:1)

这是一个RESTful操作new独有的快捷方式,其中一个对象被实例化但尚未持久存在。

例如,如果您要填写新对象的表单,您将为自己提供link_to&#34; preview&#34;,它将所有属性发送到您的预览操作(而不是直接创建)。这类似于展示视图,但对于仅存在于内存中的对象。

此功能对于销毁,更新,索引,显示或创建来说并不合乎逻辑。我想你可以在发送到更新之前分配新属性后在编辑操作上使用预览,但是你必须手动创建路径。

答案 1 :(得分:1)

实际上有一个微妙的区别。

如果将其添加到resources :comments,则生成的路径助手具有复数资源名称,因此它将为preview_new_comments,路径将为/comments/new/preview。如果将其添加到相应的单一资源中,则它不会使路径中的资源名称复数化,因此您获得/comment/new/preview,但帮助程序将为preview_new_comment。使用:on将生成具有单一资源preview_new_comment的路径助手,但路径将具有复数资源/comments/new/preview

要获得相同的行为,您可以在资源

之外使用以下更详细的路由
get 'collections/new/preview', to: 'collections#preview', as: :preview_new_comment, on: :collection

我不确定为什么没有on: :<action other than new>选项。他们建议不要在文档中有太多新动作,但如果你想要一个新的&#39;新的&#39;你似乎有可能需要一个新的编辑&#39;编辑新的&#39;新的&#39;。然而,事情变得更加复杂,因为要编辑你需要一个像collections/<id>/edit/preview这样的路径,并且上面解决方案的路径助手会停止工作,就像你期望的那样。更重要的是,在这个阶段,你可能会开始偏离选项的初衷。