1

要旨

機能切り替えのような機能をSinatraアプリケーションに組み込むことは可能ですか?

念のため、機能の切り替えについて少し ;)

バックストーリー

私はモジュール式の Sinatra プロジェクトをセットアップしました。すべてのリソースに対して // // エンドポイントを実装する傾向GETPOSTありますPUTDELETE開発中のアプリのテストとデータの操作が容易になります。

問題

本番環境に入るときに、不要なエンドポイントが存在することは望ましくありません (例: DELETE '/users')。

質問

メソッドに何らかの:developmentフラグで注釈を付けたり、before ブロックでリクエストをインターセプトしたりできますか? ヘルパーを使用してこれを行いますか?ここで正しい道を進んでいるかどうかはわかりませんが、おそらく複雑にしすぎています(?)

これについてはどうすればよいでしょうか?

もしあなたがこのようなことをしたなら、あなたの発見を国と共有できれば素晴らしいことです.

4

1 に答える 1

3

現在の環境を使用して、アクションを定義するかどうかを決定できます。例えば:

class MyApp < Sinatra::Application
  if settings.development?
    get '/admin' do
      'VIPs only'
    end
  end
end

切り替えるものがたくさんある場合は、必要かどうかを決定できる 1 つのファイルにそれらを分離することをお勧めします。

# routes/init.rb
require_relative 'main'
require_relative 'debug' if settings.development?
# routes/main.rb
class MyApp < Sinatra::Application
  get '/' do
    'Hello!'
  end
end
# routes/debug.rb
class MyApp < Sinatra::Application
  get '/admin' do
    'VIPs only'
  end
end

または、開発専用のパスを 1 か所に一覧表示する場合は、フィルター バージョンを次に示します。

class MyApp < Sinatra::Application
  DEVELOPMENT_PATHS = %w[
    /admin
  ]

  before do
    unless settings.development? || !DEVELOPMENT_PATHS.include?(request.path)
      halt 404 
    end
  end
end

次に、リストに追加するデコレーターのようなメソッドをいくつか作成することもできます。

class MyApp < Sinatra::Application
  def self.development_only(path)
    DEVELOPMENT_PATHS << path
  end

  get '/admin' do
    'VIPs only'
  end
  development_only '/admin
end

一般に、開発と本番環境で実行されるコードに大きな違いを導入する場合は注意することをお勧めします。必然的に、開発コードはテストされないままになるか、適切に保守するのが面倒になります。この場合、非表示にするつもりだったルートを見逃してしまい、本番環境の全員がルートを利用できるようになる危険性があります。これらのルートをまったく持たず、コンソールから開発環境を操作するか、反対側まで行って、sinatra-authentication のようなものを使用して、完全にテストされ、本番環境に対応したユーザー権限を構築する傾向があります。

于 2015-09-27T17:44:22.670 に答える