【问题标题】:How do I put datamapper definition into a external file如何将数据映射器定义放入外部文件
【发布时间】:2013-01-06 00:57:08
【问题描述】:

我正在一个经典的 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

【问题讨论】:

    标签: sinatra datamapper


    【解决方案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 操作。这样一来,Person 是独立且独立的,而不是分散在两个文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-20
      • 2011-10-25
      • 2020-08-11
      • 2013-10-27
      • 2017-04-23
      • 2019-04-10
      • 2011-12-21
      • 1970-01-01
      相关资源
      最近更新 更多