为什么重定向到#show动作而不传递:id param work(在rails中)?

San*_*kai 4 ruby ruby-on-rails

我有一个关于rails的简单问题.

我按照教程(来自CrashLearner).在该教程中,我们有一个简单的资源message,可以生成常规的以下路由(摘录自rake routes)

      Prefix Verb   URI Pattern                  Controller#Action
    messages GET    /messages(.:format)          messages#index
             POST   /messages(.:format)          messages#create
 new_message GET    /messages/new(.:format)      messages#new
edit_message GET    /messages/:id/edit(.:format) messages#edit
     message GET    /messages/:id(.:format)      messages#show
             PATCH  /messages/:id(.:format)      messages#update
             PUT    /messages/:id(.:format)      messages#update
             DELETE /messages/:id(.:format)      messages#destroy
Run Code Online (Sandbox Code Playgroud)

据我了解,获得show此控制器操作的路径就像是某种东西/messages/17,我的意思是我们必须放置:id我们想要查看的特定消息.

所以,如果我需要在修改它之后将用户重定向到此消息视图(在#update操作中),我应该使用:

redirect_to message_path(17)
Run Code Online (Sandbox Code Playgroud)

但事实证明,省略这一点:id实际上很有效:

redirect_to message_path
Run Code Online (Sandbox Code Playgroud)

为什么以及如何使用这个?

因为这可以从实际接收:id参数的动作开始,所以我认为控制器会将其保留在内存中,并在缺少时将其传递给引擎盖,但是我想知道这种行为来自何处?

我在rails文档中找不到任何内容.

这是本教程的github存储库,因此上述行的确切具体位置在此控制器中.

我确认这是有效的.

还有一个Comment嵌套在以前Message资源中的资源.正如你所看到的在该控制器update动作,更新评论(被嵌套在消息中)之后,控制器重定向到message_path,但在这种情况下,:id参数存在通过实例变量@message (我得知这个工作,因为对象Message回应一个.id方法,否则它应该是@message.id)

我认为为什么这里:id仍然传递的原因是因为我们在Comments控制器中并且:id另一个资源无法在引擎盖下传递,因此为什么它被明确地写出来.

我没有另外的解释..

任何人都可以解释为什么这有效吗?

lig*_*loy 7

我在Rails源代码中找到了这个:

丢失的路由密钥可以从当前请求的参数填充(例如+:controller +,+:action +,+:id +以及放置在路径中的任何其他参数).

所以这里:id存在于当前请求中params,它用于此路由.