如何将datamapper定义放入外部文件中

时间:2013-01-06 00:57:09

标签: sinatra datamapper

我正在使用经典的Sinatra应用程序中的datamapper,我的文件变得很大,无法管理和排除故障。我想知道是否可以将我的datamapper模型定义放入一个文件中,将处理算法放入另一个文件中,我将它们都调用到我的主index.rb中。我只与sinatra合作了一个月左右,但它们必须是一种以经典的方式将您的应用程序模块化为更小的可维护文件的方法。正确?

以下是我要做的事情的要点:

  1. 加载sinatra app(index.rb)。
  2. 该应用加载数据清单定义(defineDB.rb)。
  3. 该应用加载CRUD算法(proceesDB.rb)。
  4. 所以如果收到了一个put请求:

    put '/protected/person/:id' do
       @p = Person.first(:id => params[:id])
       p.update(
         #update table row 
       )
    end
    

1 个答案:

答案 0 :(得分:1)

这只是基本的Ruby,因此您可以使用requirerequire_relative

您的文件的确切组织取决于您,但这是我的偏好:

|- app.rb  # This merely require_relative's all the other ruby-files, see below.
|- README.md
|- rackup.ru
|- lib/
|   |- env.rb #contains settings and environment variables and such.
|   |- 
|- models/
|   |- person.rb # Defines datamapper fields, helper and validators for Person.
|- controllers/
|   |- person_controller.rb # Defines `put '/protected/person/:id' do` and other routing.
\- views/
    |- layout.haml
    \- person_show.haml

同样,这取决于你。我强烈建议不要过早地过度组织。例如,控制器可以省略,只要它们适合app.rb.一旦他们从那里长大并且你希望将它们分开,然后才会引入控制器文件夹。

app.rb将是一个文件,它不需要所有库:

require "sinatra"
require "datamapper"

Dir.glob(File.join("{lib,models,controllers}", "*.rb")).each{|f| require File.realpath(f)}

这将直接在lib,模型和控制器下加载所有文件。但您可能希望更多地控制文件的加载时间和方式;在这种情况下,要求每行一个是更好的选择。

我建议不要将Datamapper定义全部放在一个文件中。当您将它们组合为模型时,您可能会更好:Person获取一个文件,其中所有定义和Person活动的crud操作。这样,人就是孤立和自足的,而不是分散在两个文件上。