1

私はsinatraの使用にますます夢中になっているフロントエンドの男です。私は現在アプリを構築しており、myapp.rb ファイルのルートを DRY するエレガントな方法を見つけようとしています。

現在、私はこれらのルートを持っています:

get '/' do
  haml :content 
end

get '/content' do
  haml :content, :layout => :empty
end

get '/show_layout' do
  haml :show_layout
end

get '/conversion' do
  haml :conversion, :layout => :empty
end

get '/optout' do
  haml :optout, :layout => false
end

get '/terms' do
  haml :terms, :layout => :empty
end

テンプレートに関しては、次のようにしてそれらを組み合わせることができることを知っています。

get '/:name' do
  haml params[:name].to_sym
end

しかし、レイアウトはどうですか?ここには、layout.haml と empty.haml (:layout と :empty) の 2 つのレイアウトしかありません。:layout => false と数えると 3 つです。

これは、ハッシュを使用して行うのが最適ですか? 何かのようなもの:

layout_map = {
  "" => "",
  :content => "",
  :show_layout => "",
  :conversion => :empty,
  :optout => false,
  :terms => :empty    
}

get '/:name' do
  haml params[:name].to_sym, :layout => layout_map[:name]
end

正しい軌道に乗っているように見えますが、適切に機能させることができません。

ご助力いただきありがとうございます。

4

2 に答える 2

2

あなたはあなたを使うことができます:

get '/:name' do
  haml params[:name].to_sym
end

さらに、レイアウトを設定する変更前ルート:

before '/:name' do
  layout_map = {
    :content => "",
    :show_layout => "",
    :conversion => :empty,
    :optout => false,
    :terms => :empty    
  }
  set :layout => layout_map[params[:name]]
end

params[:name]これにより、すべての呼び出しに応じてレイアウトが設定されます。.simただし、すべてのルートを作成する場合は注意が必要です。誰かが多くの404を呼び出すと、ガベージコレクションされない大量のデッドシンボルが作成され、最終的にアプリがクラッシュします。これを行う方が良いです:

get '/:name' do
  halt 404 unless File.exist?("views/#{params[:name]}.haml")
  time = File.stat("views/#{params[:name]}.haml").ctime
  last_modified(time)
  haml params[:name].intern
end

params[:name]これは、その名前のファイルがある場合にのみシンボルを作成します。シンボルがすでに存在するので、あなたは安全な側にいます。

于 2012-08-31T20:03:11.327 に答える
0

皆様、ご協力ありがとうございました。アプリの他の要件のために、これを私の解決策として使用することになりました。

get "/:base_route/" do
  haml :"#{params[:base_route]}/content", :layout => :"#{params[:base_route]}/layout"  
end

get "/:base_route/:name" do
  layout_map = {
    :landing => :layout,
    :content => :empty,
    :show_layout => :layout,
    :conversion => :empty,
    :terms => :empty    
  }        
  haml :"#{params[:base_route]}/#{params[:name]}", :layout => :"#{params[:base_route]}/#{layout_map[params[:name].to_sym]}"
end
于 2012-09-05T14:55:44.123 に答える