Sinatra:在点击URL时运行ruby代码

don*_*ald 5 ruby sinatra

我想在每次击中网址/代码时运行脚本(code.rb).

我该如何运行脚本?

require 'sinatra'
get '/' do
  #run the script
end
Run Code Online (Sandbox Code Playgroud)

And*_*man 8

分叉另一个过程:

system('ruby code.rb')
Run Code Online (Sandbox Code Playgroud)

...或者只是load将脚本放入当前上下文中:

load 'code.rb' # *not* require
Run Code Online (Sandbox Code Playgroud)

  • 鉴于你的答案是公认的答案,根据我的回答,我是否可以建议你更新它以建议`load`而不是`require`? (4认同)

Phr*_*ogz 6

您需要load代码以确保每次运行它; require只会在第一个请求中加载一次代码,然后不再加载:

smagic:Desktop phrogz$ cat hi.rb
  puts "hi"

smagic:Desktop phrogz$ cat test.rb
  require 'sinatra'
  get '/require' do
    x = require_relative( 'hi.rb' )
    "require sez #{x}"
  end

  get '/load' do
    x = load( 'hi.rb' )
    "load sez #{x}"
  end

smagic:Desktop phrogz$ ruby test.rb 
  == Sinatra/1.1.2 has taken the stage on 4567 for development with backup from Thin
  >> Thin web server (v1.2.7 codename No Hup)
  >> Maximum connections set to 1024
  >> Listening on 0.0.0.0:4567, CTRL+C to stop
  hi
  127.0.0.1 - - [16/Jan/2011 20:49:43] "GET /require HTTP/1.1" 200 16 0.0019
  127.0.0.1 - - [16/Jan/2011 20:49:46] "GET /require HTTP/1.1" 200 17 0.0005
  hi
  127.0.0.1 - - [16/Jan/2011 20:49:52] "GET /load HTTP/1.1" 200 13 0.0009
  hi
  127.0.0.1 - - [16/Jan/2011 20:49:54] "GET /load HTTP/1.1" 200 13 0.0008
  127.0.0.1 - - [16/Jan/2011 20:50:09] "GET /require HTTP/1.1" 200 17 0.0005
  127.0.0.1 - - [16/Jan/2011 20:50:12] "GET /require HTTP/1.1" 200 17 0.0005
Run Code Online (Sandbox Code Playgroud)

输出hi在日志中的请求输入之前; 您可以看到"require"请求仅hi在第一次输出,而"load"请求hi每次都会显示.这是服务器的输出,其中true表示文件中的代码实际运行并false显示它不是:

smagic:~ phrogz$ curl http://localhost:4567/require
require sez true

smagic:~ phrogz$ curl http://localhost:4567/require
require sez false

smagic:~ phrogz$ curl http://localhost:4567/load
load sez true

smagic:~ phrogz$ curl http://localhost:4567/load
load sez true

smagic:~ phrogz$ curl http://localhost:4567/require
require sez false

smagic:~ phrogz$ curl http://localhost:4567/require
require sez false
Run Code Online (Sandbox Code Playgroud)