2011-01-25 8 views
11

ほとんどのロジックがさまざまなクラスの中で実行され、post/getルートがこれらのクラスをインスタンス化してメソッドを呼び出すSinatraアプリケーションのセットアップがあります。クラス内のルートハンドラ

私は、クラス自身の内部にpost/getルートハンドラを配置する方が良い構造になるかどうか考えています。

いずれにしても、可能かどうかを知りたいと思います。例えばだから:上記の変更を加えることなく

class Example 
    def say_hello 
    "Hello" 
    end 

    get '/hello' do 
    @message = say_hello 
    end 
end 

、シナトラはSinatraApplicationオブジェクトにはメソッドsay_helloがないと言うだろう。

答えて

21

あなただけのSinatra::Baseから継承する必要があります。

require "sinatra/base" 

class Example < Sinatra::Base 
    def say_hello 
    "Hello" 
    end 

    get "/hello" do 
    say_hello 
    end 
end 

あなたはExample.run!でアプリケーションを実行することができます。


アプリケーションの部分をさらに分割する必要がある場合は、別のSinatraアプリケーションを作成してください。モデルクラスやヘルパーに共有機能を組み込み、すべてのアプリケーションをRackと共に実行します。

module HelloHelpers 
    def say_hello 
    "Hello" 
    end 
end 

class Hello < Sinatra::Base 
    helpers HelloHelpers 

    get "/?" do 
    @message = say_hello 
    haml :index 
    end 
end 

class HelloAdmin < Sinatra::Base 
    helpers HelloHelpers 

    get "/?" do 
    @message = say_hello 
    haml :"admin/index" 
    end 
end 

config.ru:

map "/" do 
    run Hello 
end 

map "/admin" do 
    run HelloAdmin 
end 

Thinをインストールし、thin startでアプリケーションを実行します。

+0

ありがとうございます!私の目標は基本的に複数のコントローラを作成することです。私はどのようにこのように最善を尽くすか分からない - 1つのクラスは、runメソッドを使用すると、アプリケーション全体として実行されるので?助言がありますか? – dbgpyd

+0

私の答えを更新して、アプリケーションを複数のクラスに分割する方法の例を紹介しました。 –

+0

素晴らしい。ありがとうございました。 – dbgpyd

0

Sinatra Helpersを使用します。

+0

これは壊れたリンクです。 Sinatraヘルパーのドキュメントはこちらです。http://www.sinatrarb.com/intro.html#Helpers – cevaris

関連する問題