Ruby on rails - 如何构建一个 Rack 中间件作为表单验证器



在这里开始机架开发。

我有基本的博客应用程序,可以在 http://guides.rubyonrails.org/getting_started.html

我可以创建一个帖子,进行更改。好。

现在。。。

我正在学习如何使用Rack,我正在尝试创建一些中间件...

我已经关注了railscast #150和#151......你可以在github上看到我的代码......

https://github.com/thefonso/form_challenge

当我在 chrome 中的 url 行执行此操作时.....http://localhost:3000/?name=foo

我在命令行上得到了想要的结果。

aleph@mage:~/Projects/form_challenge git:master$ rails s
=> Booting WEBrick
=> Rails 3.2.11 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2013-01-23 17:01:30] INFO  WEBrick 1.3.1
[2013-01-23 17:01:30] INFO  ruby 1.9.2 (2012-04-20) [x86_64-darwin12.2.0]
[2013-01-23 17:01:30] INFO  WEBrick::HTTPServer#start: pid=32068 port=3000
{"name"=>"foo"}

太棒了,我可以看到我发送的数据。所以我希望当我从我的博客发送数据时"创建帖子"页。。。我应该能够捕获这些数据。

但是如何让应用程序的其余部分正常工作?

当我去...http://localhost:3000/

我得到机架应用程序...我想要 Rails 应用程序

现在我已经运行了这个机架中间件....它"接管"应用程序的其余部分。我无法到达Rails应用程序的"开头",或者就此而言,我希望从中接收数据的形式。

同样,整个应用程序都位于此处。

https://github.com/thefonso/form_challenge

感谢您的任何帮助。

编写中间件时,您有责任调用下一个中间件或应用程序。您的中间件现在所做的只是对每个请求进行空响应,您永远不会调用,因此 rails 甚至会看到该请求。您可以使用以下行修复它:

@app.call(env)

这是通过所有中间件继续调用链的关键线路。

所以在你的中间件中,做@app.call(env)而不是return response

如果要操作来自 rails 的响应,请执行

@status, @headers, @response = @app.call(env)

并且一定要

return [@status, @headers, @response]

当你完成时。

您的中间件在其构造函数中传递了另一个中间件/应用程序。该应用程序响应#call,因此,如果要将[可能更改的]请求和环境传递给下一个应用程序,则只需在该内部应用程序上调用#call即可。

将中间件视为管道:

A ->

B -> C

您的请求进入最外层的中间件 A,它可以立即返回响应,也可以调用中间件 B(它有引用),并根据 B 的返回值和 B 所做的任何修改来决定要做什么。B也是如此,取决于C。

有意义?

相关内容

  • 没有找到相关文章

最新更新