Sinatra Sinatra 项目里的文件如何拆分?

hegwin · 2013年01月22日 · 最后由 mimosa 回复于 2013年01月23日 · 4168 次阅读

呃,叙事之前介绍背景总归是好的。那么,事情的经过是这样的:我们要做个小的项目,只是读写文件,不用连接数据库,也没什么复杂的逻辑。鉴于需求和实现都挺简单,于是我们就选择了 sinatra 这个框架。

那开发之初,在项目的根目录下,于是就有了一个 application.rb 的文件,一个 views 目录和 public 目录,当然还有万众期待(雾)的 README。

S01

Root Directory
  |--public/
  |  |--CSS and JS here
  |--views/
  |  |--HTML here
  |--aplication.rb
  |--README.md

后来随着开发的进行,我们需要一些额外的 gem,于是就建了 Gemfile 这个文件,用于控制 gem 和其版本。

S02

Root Directory
  |--public/
  |  |--CSS and JS here
  |--views/
  |  |--HTML here
  |--aplication.rb
  |--Gemfile
  |--Gemfile.lock
  |--README.md

前面说过我们要读文件嘛,然后有的文件解析比较复杂点,放在 application.rb 会没法看出重点,又没有现成的 gem 用,于是自己简单写了个,放在 lib 目录下面。

S03

Root Directory
  |--lib/
  |  |--Some .rb files here
  |--public/
  |  |--CSS and JS here
  |--views/
  |  |--HTML here
  |--aplication.rb
  |--Gemfile
  |--Gemfile.lock
  |--README.md

后来项目需要进行一些数据的初始化,还需要一两个用于登陆的角色,鉴于之前都没用数据库,这里也只是把这些信息写在 yml 文件里,放在 config 这个目录下。

S04

Root Directory
  |--config/
  |  |--config.yml
  |  |--user.yml
  |--lib/
  |  |--Some .rb files here
  |--public/
  |  |--CSS and JS here
  |--views/
  |  |--HTML here
  |--aplication.rb
  |--Gemfile
  |--Gemfile.lock
  |--README.md

好,最后要部署了,加了 config.ru,然后还有些必要的文件,比如 tmp 和 log 这俩目录,那最终的结构就是这样的。

S05

Root Directory
  |--config/
  |  |--config.yml
  |  |--user.yml
  |--lib/
  |  |--Some .rb files here
  |--log/
  |--public/
  |  |--CSS and JS here
  |--tmp/
  |--views/
  |  |--HTML here
  |--aplication.rb
  |--config.ru
  |--Gemfile
  |--Gemfile.lock
  |--README.md

目前已经基本就是这样,那么下一步的打算是拆分 application.rb,原因是这个文件日渐臃肿并且 configure,helper 和那些 get '/xxx' do; miao!; end混在一个文件里,文件行数很多不太爽。于是我就好奇这个应该要怎么拆才好。 我希望像 rails 那样有个 app 目录,把 application.rb 拆出来的文件丢进去,但是仍然犹疑不决。 helper 单独拿出来,这个没啥争议。 configure 也可以拿出来,但是一般这个文件似乎是放在根目录下吧。 然后那堆get '/xxx' do; yeah!; end,这种到底算是 routes 呢还是 controller 呢……十分纠结,我还写了一些 before filter,如果那些算作是 routes 的话,before filter 和 routes 放在一起似乎不太合适。 在 application.rb 里还有一部分是作为 http 基本验证的部分,类似use Rack::Auth::Basic do |username, password|,似乎是独立的逻辑,不知往何处放。 我去 github(默哀)上参考了些 sinatra 的项目,似乎也没什么定式……

事情和我自己的想法就是这样,其实就现在的情况而言,我不去拆分 application.rb 也行,但是现在由于之前的 routes 写的不好,最终也免不了要改一番。如果是出于“这个文件不拆就看不下去”的理由,各位能否给点意见呢。

rails new一下,然后把目录结构 copy 过来,把 sinatra 代码填充进去。

#1 楼 @Saito 似乎生成的东西就和 rails 一样了,倒提醒了我,也要考虑加 test 进去

#2 楼 @hooopo 是个好主意,不过我现在刚接触到 sinatra,想自己一点点搭起来试试


#in config.ru
map '/user' do
  run App::User
end

map '/post' do
  run App::Post
end

# in app/user.rb
class App::User < Sinatra::Base
end

# in app/post.rb
class App::Post < Sinatra::Base
end

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