我有一个关于 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
据我所知,到达此 Controller 的 show
操作的路径类似于 /messages/17
,我的意思是我们必须放置 :我们要查看的特定消息的 ID
。
因此,如果我需要在用户修改消息 View 后将其重定向到此消息 View (在 #update
操作中),我应该使用:
redirect_to message_path(17)
但事实证明,省略这个 :id
实际上效果很好:
redirect_to message_path
为什么以及最后一个如何工作?
因为这是从一个实际接收 :id
参数的 Action 开始的,所以我想 Controller 将它保存在内存中,并在默认情况下在后台传递它缺少但我想了解这种行为从何而来?
我在 Rails 文档中找不到任何内容。
这里是教程的github仓库,所以上面那行的具体位置是here in this controller .
我确认这有效。
还有一个 Comment
资源,它嵌套自先前的 Message
资源。
如你所见in that controller on the update
action ,在更新评论(嵌套在消息中)后, Controller 重定向到 message_path
但在这种情况下 :id
参数通过实例变量 存在@message
(我了解到这是有效的,因为对象 Message
响应 .id
方法,否则它应该是 @message。 id
)
我想为什么这里 :id
仍然通过的原因是因为我们在 Comments
Controller 和 :id
无法在幕后传递另一个资源,因此明确编写了它。
我没有其他解释..
谁能给我解释一下为什么会这样?
最佳答案
我在 Rails source 中找到了这个:
Missing routes keys may be filled in from the current request's parameters (e.g. +:controller+, +:action+, +:id+ and any other parameters that are placed in the path).
所以这里的:id
存在于当前请求的params
中,用于这条路由。
关于ruby-on-rails - 为什么在不传递 :id param work (in rails)? 的情况下重定向到 #show 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40785322/