ruby - 为每个请求创建新的 sinatra 对象,但初始化仅调用一次

标签 ruby sinatra

我通过以下脚本创建了一个非常简单的网络服务器:

require 'sinatra'

class MyApp < Sinatra::Base

    def initialize(app = nil)
        super(app)
        puts "******** constructing myapp **********"
    end

    get '/' do
        return "object id: #{object_id}, class #{self.class}"
    end

end

MyApp.run!

如果我运行这个小型 Web 服务器,然后第一次调用 wget -q -O - http://localhost:4567,我会在运行服务器的控制台中看到以下内容:

******** constructing myapp **********
127.0.0.1 - - [28/Jan/2017:16:47:39 EST] "GET / HTTP/1.1" 200 31
- -> /

和 wget 打印:

object id: 10454240, class MyApp

正如预期的那样,在第一次调用时,将创建一个 MyApp 对象并调用 initialize

然后,如果我第二次调用 wget -q -O - http://localhost:4567,我会看到以下内容:

127.0.0.1 - - [28/Jan/2017:16:49:11 EST] "GET / HTTP/1.1" 200 31
- -> /

wget 的输出打印如下:

object id: 9387860, class MyApp

因此,在第二次调用时,我有一个不同的 MyApp 实例(因为 object_id 的值与第一次调用时的值不同)但是初始化是没有被调用。如何创建一个新对象并绕过对 initialize 的调用?

最佳答案

为每个请求创建一个新类。该实例不是与 Sinatra::Application.new 相关,而是与 Sinatra::Application.prototype.dup 相关,这就是为什么initialize 并不是每次都被调用。看 document link 获取代码。

关于ruby - 为每个请求创建新的 sinatra 对象,但初始化仅调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41915269/

相关文章:

ruby - rspec 期望抛出 "undefined method"

mysql - 在 Mac 上为 Ruby on Rails 设置本地 Web 服务器

ruby - 如何以编程方式获取已爬网网页的快照(在 Ruby 中)?

ruby - Markdown,启用 block 级 html 中的 markdown 处理

javascript - 之前的web form录入数据后,如何让web form出现?

ruby - Heroku 将我的 sinatra 应用程序检测为 node.js 应用程序并失败

ruby - 如何将数据从我的 sinatra 应用程序中的类传递到 websocket-rack?

Ruby/SQLite3 结果作为散列返回重复数据

javascript - 如何通过 get 请求显示 popen 输出?

ruby - 为什么 Ruby 'require' 不允许相对路径?