3

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

get '/derp' do
    haml :derp
end

我很快开始思考:如果我有十几页,我是否必须为每个 url 写一个 get/do 语句,如上所述?必须有一种方法可以使用变量来执行以下操作:

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

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

那可能吗?我是否误解了它应该如何工作的一些基本方面 - 我是否应该在继续学习时忽略这个问题并稍后再回来?

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

4

2 回答 2

4

你可以这样做:

get '/:allroutes' do
  haml param[:allroutes].to_sym
end

这将显示 :allroutes 的haml模板。例如,如果你点击localhost/test它会在下面显示模板test等等。更简单的版本是使用 sinatra 提供的match all路由:

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.
于 2012-07-25T05:31:14.330 回答
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
于 2014-03-31T15:15:22.917 回答