将路线映射到Sinatra的布局,帮助我清理它

时间:2012-08-31 19:27:37

标签: ruby-on-rails ruby sinatra

我是一个越来越多地使用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,和:),如果你算数则为3:layout =>假

这是使用哈希最好的事情吗?类似的东西:

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

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

似乎它在正确的轨道上,但我无法让它正常工作。

感谢您的帮助。

2 个答案:

答案 0 :(得分: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]创建符号。所以你是安全的,因为符号已经存在。

答案 1 :(得分: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