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或其他数据库的应用上使用。