Rack It Up

Rack it up (proc) 一个最简单的rack应用程序可以是:一个简单的ruby对象,包含了一个call方法。这个call方法接受一个参数,并返回一个有三个元素的数组即可: def call(env) [200, {}, ["content"]] end 其中参数env将被rack用作HTTP请求对象来传递进来,而函数的返回值与HTTP响应对应:分别为状态码,HTTP头信息以及响应内容。

August 2, 2013 1 min

Alfred插件开发 - Sinatra

###Alfred简介 Alfred是Mac下的一个小工具,可以极大的提高使用计算机的效率。Alfred提供非常丰富的功能集,比如: 基本的文件/目录查找功能 应用程序加载器 快速的搜索(google,wikipedia) ####powerpack Alfred本身是免费的,但是一些高级的功能,如: 自定义扩展(非常有用) 剪贴板栈/代码片段管理(非常有用) iTunes控制 近期访过的文档 提供在powerpack中,这个功能是要收费的,不过个人觉得绝对的物超所值。这些功能可以极大的提高我对计算机的使用效率,而且剪贴板栈功能可以节省我很多的时间。 ###扩展编写 经常会使用sinatra编写一些简单的Web应用程序,以用作一些showcase和应用程序的原型搭建。但是由于sinatra并不是一个框架,并不会像rails那样自动生成目录结构等,而每个sinatra应用的目录结构和文件依赖都非常相似,因此完全可以考虑将这个过程自动化。 基本思路是: 定义一个目录结构的模板 每次开始一个sinatra工程时,将个模板目录拷贝到新的工程下 一些库依赖的下载(bundle install以及JavaScript库的下载) 在编辑器中打开这个新的目录 ####一个sinatra工程的原型 $ pwd /Users/twer/develop/templates/sinatra $ tree -a . ├── .rvmrc ├── Gemfile ├── app.rb ├── config.ru ├── public │ ├── css │ └── scripts │ ├── app.js │ └── libs └── views ####Extension shell script # create the project folder cd ~/develop/ruby && mkdir -p {query} && cd {query} # cp info to folder cp -R ~/develop/templates/sinatra/ ....

May 18, 2013 1 min

使用Active Record

###ActiveRecord 作为rails中的ORM(object relation-db mapping)框架,ActiveRecord在初次出现之时带给了人们以无限的惊喜和热情,也使得很多不堪忍受其他语言中粗糙的ORM框架的开发者转而投入rials的怀抱。而有很多的其他语言也在不断尝试模仿ActiveRecord,比如著名的php框架codeigniter。 在rails的后期版本中,ActiveRecord可以作为一个独立的库来在rails之外使用,这对使用ruby进行其他数据库应用开发的用户来说非常方便。 ####在新的项目中使用ActiveRecord 如果在一个全新的rails应用程序中使用ActiveRecord,那么关于数据库方面的一切都可以托管给它,开发者在初期可能连一行代码都不需要编写就可以让程序“像模像样”的运行起来。 ####在已有的数据库上使用ActiveRecord 现实世界中,最可能遇到的问题是数据库已经存在了(毕竟,对于关系型数据库而言,修改schema的影响太大)。这时候,我们仍然可以使用ActiveRecord来方便的访问数据库,得到ruby对象,而跳过冗长且容易出错的数据库访问层。 ###一个例子 ####数据库结构 数据库中有一个访客表(visitor): +-----------------------+--------------+-----+ | Field | Type | Key | +-----------------------+--------------+-----+ | visitor_uid | varchar(32) | PRI | | visitor_login_id | varchar(128) | MUL | | visitor_password | varchar(32) | | | visitor_name | varchar(100) | | | created_timestamp | timestamp | | | password_expiration | timestamp | | | last_used_timestamp | timestamp | MUL | | visitor_alias | varchar(128) | MUL | | visitor_password_hash | binary(64) | | +-----------------------+--------------+-----+ 有一个访客浏览过的分组表(list_group):...

May 18, 2013 2 min

Ruby中的Proc

##block in ruby block在ruby中,相当于JavaScript中的匿名函数,可以用来实现诸如高阶函数等。高阶函数最好用的一个特点就是它很好的将“动作”(action)本身抽象成了一个对象来传递。 block本身不是对象,但是可以被转换成Proc类的实例,然后以一种特别的方式执行。 > proc = lambda {puts "hello, world"} => #<Proc:0x007ff11284d068@(irb):8 (lambda)> 或者 > proc = lambda do > puts "hello, world" > end 从irb打印的信息可以看出,<Proc:0x007ff11284d068@(irb):8 (lambda)>是一个Proc类的实例用lambda生成的block对象,看起来像一个ruby中定义的函数/方法一样,但是执行的时候需要特别的调用方式: > proc.call hello, world => nil 如果需要参数,可以这样指定: > proc = lambda {|a, b| a + b} => #<Proc:0x007ff114843d40@(irb):14 (lambda)> > proc.call(1,2) => 3 > proc.call("hello, ","world") => "hello, world" ##proc自身 ruby中大名鼎鼎的rack应用程序,本质上就只是负责调用一个block来获得结果: rack_proc = lambda {|env| [200, {}, ["<h1>Hello, world</h1>"]]} rack_proc.call({}) 也可以使用proc来创建一个Proc:...

May 12, 2013 1 min