sinatra/activerecord/grape小试


以下是最近今天学习sinatra等框架的使用笔记。

sinatra

参考文档 http://www.sinatrarb.com/intro.html
个人感觉类似Spring MVC,主要学习了

  • URL映射
  • 参数
  • 静态文件
  • 模板处理(ERB)
  • 变量传递

sinatra很容易上手,helloworld非常快。

require 'sinatra'

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

获取请求字符串的参数用上下文变量params,比如/foo?id=1中的params['id']
静态文件,默认在同级目录public中,比如你定义这样的模板

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Sinatra Hi</title>
  </head>
  <body>
    <%= Time.now %>
    <script async defer src="main.js"></script>
  </body>
</html>

这里的main.js为同级目录public/main.js。
模板有很多,这里选择Rails默认的ERB。模板默认位置为views,命名为view_name.erb,比如下面第一段代码对应views/index.erb

get '/' do
  erb :index
end

get '/view-var' do
  @user = 'xnnyygn'
  erb '<%= @user %>'
end

代入变量很重要,sinatra这里的语法和rails很像,就是@开始的变量,erb中可以引用。这里的变量数据如果从数据库中取的话,一个简单的网站原型就有了。

activerecord

脱离rails使用activerecord并不是很复杂,有点类似直接用JDBC,基本用法

require 'active_record'
require 'sqlite3'
require 'yaml'

#
# database.xml
#
# adapter: sqlite3
# database: db.sqlite3
#

db_cfg = YAML::load_file('database.yml')

ActiveRecord::Base.establish_connection(db_cfg)

class User < ActiveRecord::Base
end

puts User.count

主要是加载数据库配置,创建连接,定义ORM模型,执行。
唯一有点不明确的是,哪里可以释放连接?

grape

另外一个还学习了的是grape,一个快速创建Restful接口的框架。个人感觉直接用rails也可以,不过对Restful接口来说rails的view层是多余的,裁剪成restful层+数据层差不多。

grape编写和启动与sinatra不同,需要rackup。对于我这个rack外行来说还需要花点时间理解。之后我是参照https://github.com/3scale/sentiment-api-example/tree/master/version_1这里的样子编写的,有一个config.ru。主体部分是一个用上面那段activerecord代码去取的:

.
├── app
│   └── app.rb
├── config.ru
├── database.yml
├── db.sqlite3
└── models
    └── users.rb

config.ru

$:.unshift "./app"

require 'app'

run PG::API

app.rb

require 'active_record'
require 'sqlite3'
require 'yaml'
require 'grape'

require File.expand_path('models/users.rb')

# load database configuration
db_cfg = YAML::load_file(File.expand_path('database.yml'))
ActiveRecord::Base.establish_connection(db_cfg)

module PG
  class API < Grape::API
    version 'v1'
    format :json

    resource :users do

      desc 'Return all users'
      get :all do
        User.find(1)
      end
    end
  end
end

注意下require的ruby代码的路径,虽然有一层app目录,但执行此文件是在根目录。
最后访问http://localhost:9292/v1/users/all应该就可以得到数据。

以上就是最近学习的一点ruby相关的知识。下一步可能会从ruby china上看看基础重新学习。