我是一个越来越多地使用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
似乎它在正确的轨道上,但我无法让它正常工作。
感谢您的帮助。
答案 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