0

従来のSinatraアプリでdatamapperを使用していますが、ファイルの管理とトラブルシューティングが大きくなりつつあります。データマッパーモデル定義を1つのファイルに入れ、処理アルゴリズムを別のファイルに入れて、両方をメインのindex.rbに呼び出すことができるかどうか疑問に思いました。私はsinatraを使って1か月ほどしか仕事をしていませんが、これはアプリをより小さな保守可能なファイルにモジュール化するための古典的な方法であるに違いありません。右?

これが私がやろうとしていることの要点です:

  1. sinatraアプリ(index.rb)をロードします。
  2. アプリはデータマッパー定義(defineDB.rb)をロードします。
  3. アプリはCRUDアルゴリズム(proceesDB.rb)をロードします。

したがって、プットリクエストを受け取った場合:

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

1 に答える 1

1

これは単なる基本的な Ruby であるため、requireまたはを使用できます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、モデル、およびコントローラーの直下にあるすべてのファイルがロードされます。しかし、いつ、どのようにファイルをロードするかについて、より細かく制御したい場合があります。その場合は、1 行に 1 つずつ要求する方が適切です。

Datamapper 定義をすべて 1 つのファイルに入れることはお勧めしません。それらをモデルとしてグループ化すると、おそらくより良い結果が得られます。Person は、Person のすべての定義と crud アクションが存在する 1 つのファイルを取得します。そうすれば、Person は 2 つのファイルに分散するのではなく、分離され自己完結型になります。

于 2013-01-07T11:29:45.500 に答える