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

时间:2016-11-24 11:31:51

标签: ruby-on-rails ruby

我有一个关于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

据我所知,进入此控制器的show操作的路径类似于/messages/17,我的意思是我们必须将要查看的特定消息的:id放入

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

redirect_to message_path(17)

但事实证明,省略这个:id实际上很有用:

redirect_to message_path

为什么以及最后一个如何工作?

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

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

以下是本教程的github存储库,因此上述行的具体位置为here in this controller

我确认这是有效的。

还有一个Comment资源嵌套在先前的Message资源中。 正如您可以看到in that controller on the update action,在更新注释(嵌套在消息中)之后,控制器会重定向到message_path,但在这种情况下,:id参数通过实例变量{存在{1}} (我了解到这是有效的,因为对象@message会响应Message方法,否则它应该是.id

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

我没有另外的解释..

任何人都可以解释一下为什么会这样吗?

2 个答案:

答案 0 :(得分:7)

我在Rails source中找到了这个:

  

可以从当前请求中填写缺少的路线密钥   参数(例如+:controller +,+:action +,+:id +和其他任何参数   放在路径中的参数。)

因此,当前请求:id中存在params,并且它已用于此路线。

答案 1 :(得分:0)

如果您定义了单数资源,那么您将在没有:id param

的情况下执行show动作

http://edgeguides.rubyonrails.org/routing.html#singular-resources