1

我是一个越来越喜欢使用 sinatra 的前端人员。我目前正在构建一个应用程序,并试图找到一种优雅的方式来干燥 myapp.rb 文件中的路线。

目前我有这些路线:

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

但是布局呢?这里只有 2 个布局,layout.haml 和 empty.haml(:layout 和 :empty),如果算上 3 个 :layout => false

这是最好使用哈希完成的事情吗?就像是:

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 回答