所以我正在学习使用Sinatra(非常基础),我理解以下基本代码:
get '/derp' do
haml :derp
end
我很快就想到:如果我有十几页,我是否必须为每个网址写一个get / do语句,如上所述?必须有一种方法可以使用变量来做这样的事情:
get '/$var' do
haml :$var
end
其中$var
是我输入的任何内容。基本上,如果我在地址栏中输入/foo
,我希望Sinatra查找名为foo.haml
的视图并使用它,或者显示一个404. /bar
,/derp
等相同。
这可能吗?我是否误解了这应该如何运作的一些基本方面 - 在我不断学习并稍后再回过头来时,我是否应该忽略这个问题?
这似乎是一个非常简单的事情,可以让生活更轻松,我无法想象人们会手动宣布每一页......
答案 0 :(得分:4)
你可以这样做:
get '/:allroutes' do
haml param[:allroutes].to_sym
end
将显示haml模板:allroutes是。例如,如果您点击localhost/test
,它会在test
下显示模板,依此类推。更简单的版本是使用sinatra提供的匹配所有路由:
get '/*/test' do
# The * value can be accessed by using params[:splat]
# assuming you accessed the address localhost/foo/test, the values would be
# params[:splat] # => ['foo']
haml params[:splat][0].to_sym # This displays the splat.haml template.
end
get '/*/test/*/notest' do
# assuming you accessed the address localhost/foo/test/bar/notest
# params[:splat] # => ['foo', 'bar']
haml params[:splat][0].to_sym # etc etc...
end
# And now, all you need to do inside the blocks is to convert the variables into
# a symbol and pass in to haml to get that template.
答案 1 :(得分:0)
除了Kashyap的优秀答案。
如果您想为参数命名而不必将它们从params
哈希中取出,您可以:
get '/*/test/*/notest' do |first, second|
# assuming you accessed the address localhost/foo/test/bar/notest
# first => 'foo'
# second => 'bar'
haml first.to_sym # etc etc
end