在Sinatra我可以在路线中使用变量吗?视图?

时间:2012-07-25 05:16:45

标签: ruby sinatra haml

所以我正在学习使用Sinatra(非常基础),我理解以下基本代码:

get '/derp' do
    haml :derp
end

我很快就想到:如果我有十几页,我是否必须为每个网址写一个get / do语句,如上所述?必须有一种方法可以使用变量来做这样的事情:

get '/$var' do
    haml :$var
end

其中$var是我输入的任何内容。基本上,如果我在地址栏中输入/foo,我希望Sinatra查找名为foo.haml的视图并使用它,或者显示一个404. /bar/derp等相同。

这可能吗?我是否误解了这应该如何运作的一些基本方面 - 在我不断学习并稍后再回过头来时,我是否应该忽略这个问题?

这似乎是一个非常简单的事情,可以让生活更轻松,我无法想象人们会手动宣布每一页......

2 个答案:

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