2013-01-06 37 views
0

我正在使用經典的Sinatra應用程序中的數據映射器,並且我的文件需要大量才能管理和排除故障。我想知道是否可以將我的數據映射器模型定義放入一個文件中,並將處理算法放入另一個文件中,並將它們都調用到我的主要index.rb中。我一直在與sinatra合作一個月左右,但他們必須以一種經典的方式將您的應用程序模塊化爲更小的可維護文件。對?如何將數據映射器定義放入外部文件

這裏是我想要做的要點:

  1. 負載西納特拉應用(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 

回答

1

這只是基本的拼音,這樣你就可以使用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的所有定義和殘留動作都會生效。這樣,人是孤立的,自成體系的,而不是分散在兩個文件中。

相關問題