1

我对 Rails 堆栈的简单理解是它执行以下操作(通常)

  1. 输入是一个 HTTP 消息(GET、POST、PUT、DELETE、HEAD)、一个 URL、一些(可选)cookie、一个(可选)会话令牌,可能还有一些以 JSON 或 XML 格式打包的数据。
  2. 这个 HTTP 消息由 Rack 处理,它可以通过一组“中间件”函数运行它,这些函数从消息中添加或删除数据,并且可以使用这些数据从程序的数据存储中添加、更改或删除数据。
  3. Rack 输出的 HTTP 消息被发送到 Rails 路由器,后者将其映射到控制器、操作和参数散列,其中包含会话信息、cookie 和其他参数。数据被分派给适当的控制器。
  4. 控制器方法解析参数,并在算法上将其与数据库中的数据(通过模型)组合,可选地更改数据,然后将一组以 @ 开头的变量调度到视图模板。
  5. 视图模板获取数据并将其与视图模板合并以形成具有适当格式(例如 HTML、JS、JSON、XML 等)的视图,或者它告诉调用者(通过 HTTP 返回代码)重定向到另一个网址。

我想使用 Rails 控制台对我的 Rails Web 应用程序执行的操作是

  1. 使用 URL、会话 ID、cookie 和编码数据(JSON 或 XML)编写有效的 HTTP 消息。
  2. 将此数据注入 Rack 接口,并在将其发送到 Rails 路由器之前检查输出的内容。
  3. 然后我想将该数据发送到 Rails 路由器,看看在它进入控制器之前会出现什么。
  4. 然后我想将该数据发送到控制器,看看在发送到视图模板之前会出现什么。
  5. 然后我想获取该数据并通过视图模板运行它并在 STDOUT 上显示,或者让它自动打开 Web 浏览器并查看它的呈现。

是否有任何现有的 Rails 工具可以做到这一点?如果没有,谁能指出这些接口出现的 Rails 代码?

4

1 回答 1

0

您要查找的大部分内容都在 rails 的 actionpack 库中。

ActionDispatch 处理与机架、中间件和路由器的接口。该请求作为最后一个中间件到达路由器。路由器本身在 action_dispatch/routing/mapper 中被调用。因此,如果您想在请求到达路由器之前拦截请求,请在调用路由之前注入您自己的中间件。

一旦路由器映射验证它有一个有效的路由,它就会调用 railties 库中的应用程序。我相信这会让你回到动作包到 ActionController 中间件中。我不确定在到达控制器之前你想在哪里拦截,但我猜它会在那个 ActionMiddleware 类周围的某个地方。

从那里你进入行动包。你的控制器调用的渲染/重定向设置了 actionpack 中会发生什么。我不确定 AC 调用 AP 的确切位置,但您应该能够通过它筛选并找到您正在寻找的路径。

至于响应,你回到中间件。一旦 rails 将视图拼接在一起,它基本上会自行展开并返回中间件堆栈,然后再将响应发送回 Rack。

希望有帮助。

于 2012-11-28T01:07:11.583 回答