Rails中使用Stone
Stone是一个数据持久化Ruby库。它把数据保持至文件中(ymal格式),特点是快速易用,因而特别适用于小规模的应用。
要在Rails中使用Stone是非常简单的。我们来创建一个简单的Todo应用:
首先安装Stone:
sudo gem install stone
创建Rails应用:
rails todo
在 config/initializers 中新建一个文件,命名为 stone.rb,文件内容如下:
require 'stone'
Stone.start(Dir.pwd, Dir.glob(File.join(Dir.pwd,"app/models/*")), :rails)
接下去,去掉 ActiveRecord 的使用。在 config/environment.rb 中加入:
config.frameworks -= [ :active_record ]
准备工作完成了。现在使用Stone的stone-gen命令来生成一个model:
stone-gen model Todo title:string
生成后,可以发现 app/models 目录下自动创建了一个 todo.rb 文件,其内容如下:
class Todo
include Stone::Resource
field :title, String
end
好了,model有了,我们偷偷懒,用scaffold来创建一个controller(因为我们已经有了model,所以加上–skip-migration参数):
script/generate scaffold Todo --skip-migration
自动生成的controller和view还跑不起来,因为Stone的model方法跟ActiveRecord有所区别,需要调整一下。我们先来改各个view:
在new.html.erb中的表单中,加入:
<p><label>Title:</label><%= f.text_field :title %></p>
在show.html.erb最上边,加入:
<%= h @todo.title %>
其他view先不管了。接下去修改todos_controller:
将index中的:
@todos = Todo.find(all)
修改为:
@todos = Todo.all
将show中的:
@todo = Todo.find(params[:id])
修改为:
@todo = Todo[params[:id]]
好了,用script/server把应用跑起来,测试一下。访问http://localhost:3000/todos/new,创建一个新的todo:
创建成功后,访问http://localhost:3000/todos/1,显示也正确:
不错,果然是非常易用。那么Stone把数据存到哪去了呢?答案是在app/datastore下。在这个目录下可以找到一个todo子目录,里边有刚创建的todo对象的数据文件1.yml,文件内容为:
--- !ruby/object:Todo
errors: !ruby/object:Validatable::Errors
errors: {}
id: 1
title: "tada #1"
结论:Stone很好很强大,待这个库发展更成熟一些后,可以在规模较小又不计划使用MySql或其他数据库的应用上使用。