0

我正在一个经典的 Sinatra 应用程序中使用 datamapper,我的文件变得越来越大,难以管理和排除故障。我想知道是否可以将我的数据映射器模型定义放入一个文件中,将处理算法放入另一个文件中,然后将它们都放入我的主 index.rb 中。我只使用 sinatra 一个月左右,但它们必须是一种以经典方式将您的应用程序模块化为更小的可维护文件的方法。对?

这是我正在尝试做的事情的要点:

  1. 加载 sinatra 应用程序 (index.rb)。
  2. 该应用程序加载数据映射器定义 (defineDB.rb)。
  3. 该应用程序加载 CRUD 算法 (proceesDB.rb)。

因此,如果收到 put 请求:

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

1 回答 1

1

这只是基本的 Ruby,所以你可以使用requireor require_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 操作。这样 Person 是孤立和自包含的,而不是分布在两个文件中。

于 2013-01-07T11:29:45.500 回答