新手问题 我感觉 roda 用来取代 sinatra 挺好的

u4crella · 2020年04月30日 · 最后由 shiweifu 回复于 2020年07月19日 · 3350 次阅读

sinatra 默认就是一个全局 get '/' { ...},我个人不喜欢这种污染全局的绑定,所以一直在找比 sinatra 好一点又比 rails 轻的 web 框架。cuba 框架没人用了,roda 好像还在经常维护,于是试用了一下 roda。

下面是我刚才学的 roda 配置代码。想问几个问题。

$path = 'D:/pg/projs/workdir'

require 'roda'
require "#{$path}/web/html_worker.rb" # 导入类Worker
require 'erb'

$wk = Worker.new($path)

class WebApp < Roda
  plugin :public, root: "#{$path}/web/f" # 用来发送静态文件

  route { |r|

    r.public 

    r.root do
      return $wk.msg('你在首页')
    end

    r.get 'board' do
      text = r.params['q']
      # ...
      html = $wk.write_boards_indexes(board_names) 
      return html
      #~ return 'i know'
    end

    r.get 'welcome' do
      # 欢迎页
      html = $wk.write_welcome_page
      return html
    end

    r.get 'readyml' do
      # 新的爬虫抓取完成,需要重新读取帖子数据
      $wk.read_profile
      puts '重新读取帖子信息完成.'
      return $wk.msg('更新完成.')
    end

  }
end

run WebApp.freeze.app

代码执行方式是 rackup,可以设置监听的设置:rackup -o 0.0.0.0 -p 955 # 监听本机上 055 端口。

那么在这个代码里,要怎样修改才能让 Worker.new($path) 不需要被设置成全局变量,也能在 Roda 里面被用得上呢?不是很懂 rack 和 config.ru 的设法

Sinatra 也支持“Classic Style”

require 'sinatra/base'

class MyApp < Sinatra::Base
  set :sessions, true
  set :foo, 'bar'

  get '/' do
    'Hello world!'
  end
end

http://sinatrarb.com/intro.html 你搜 Sinatra::Base

刚才发现可以在 roda 里面直接用正常的 ruby 语法,比如新建一个对象:

class WebApp < Roda
  h = Hash.new # 新建对象
  route { |r|
    r.root do
      return 'hi'
    end
  }
end

roda 路由写法很舒服

需要 登录 后方可回复, 如果你还没有账号请 注册新账号