9

コンポーネントをグループ化する Sinatra アプリケーションを作成しようとしています (コントローラーのようなもの)。ということで、「ブログ」関連では、Blogmounted atというアプリが欲しいです/blogBlogアプリに含まれるすべてのルートは、マウントされたパスに対して相対的であるため、indexルートでマウント パスを指定しなくても、単純にルートを定義できます。

私は当初、 config.ru ファイルを使用しmapてさまざまなアプリへのルートを指定することでこれを処理していました。私が遭遇したこれに関する問題は、すべてのアプリに含める必要があるさまざまなsinatra gem/extensions/helperを使用していたため、多くの重複コードがあったことです.

アプリで定義されたルートがアプリがマウントされている場所に関連するように、あるsinatraアプリを別のアプリ内にマウントするにはどうすればよいですか? これがすぐに使用できない場合は、これを行う方法のコード サンプルを示してもらえますか?

これがどのように見えるかの簡単な例を次に示します。

class App
  mount Blog, at: '/blog'
  mount Foo, at: '/bar'
end

class Blog
  get '/' do
    # index action
  end
end

class Foo
  get '/' do
    # index action
  end
end
4

2 に答える 2

3

名前空間に関するいくつかのアイデアがあるhttps://stackoverflow.com/a/15699791/335847をご覧ください。

個人的には、マップされたルートで config.ru を使用します。あなたが本当に「これは別のアプリであるべきか、それともこのように整理するのに役立つだけなのか」の間のスペースにいる場合は、それが可能であり、後でコードを変更せずにアプリの1つを単独でファームオフすることができます(またはほんの少し)。重複した設定コードがたくさんあることに気付いた場合は、次のようにします。

# base_controller.rb

require 'sinatra/base'
require "haml"
# now come some shameless plugs for extensions I maintain :)
require "sinatra/partial"
require "sinatra/exstatic_assets"

module MyAmazingApp
  class BaseController < Sinatra::Base
    register Sinatra::Partial
    register Sinatra::Exstatic

  end

  class Blog < BaseController
    # this gets all the stuff already registered.
  end

  class Foo < BaseController
    # this does too!
  end
end

# config.ru

# this is just me being lazy
# it'd add in the /base_controller route too, so you
# may want to change it slightly :)
MyAmazingApp.constants.each do |const|
  map "/#{const.name.downcase}" do
    run const
  end
end

以下は、 Sinatra Up and Runningからの引用です。

設定だけでなく、Sinatra クラスのすべての側面がそのサブクラスに継承されます。これには、定義済みのルート、すべてのエラー ハンドラー、拡張機能、ミドルウェアなどが含まれます。

この手法 (およびその他) を使用した良い例がいくつかあります。恥知らずのプラグモードなので、関係ないのにオススメです!:)

于 2013-07-02T18:31:24.800 に答える