在sinatra中使用路径定义中的参数

时间:2011-11-10 15:42:55

标签: ruby sinatra

我已经尝试了几个小时,但仍无法按照我想要的方式配置路线。

我想要实现的目标是:

http://fooo.bar/prefix1234

我想捕获以specificix前缀开头的所有内容。

非常简单:

get "/prefix:id" do
 puts params[:id]
end

但我不希望它是一个固定的前缀。我想把前缀放在配置文件中

settings.rb: set:前缀,'pre'

get "/#{settings.prefix}:id" do
 puts params[:id]
end

这不起作用(Sinatra :: Application:Class(NoMethodError)的未定义方法`prefix')。我也尝试用正则表达式捕获:

before do
 @prefix = settings.prefix
end

get %r{#{@prefix}(\d+)} do |id| 
 puts "Params:  #{id}"
end

这也不起作用(不会捕获URL)

有人得到了什么吗?

2 个答案:

答案 0 :(得分:3)

我能够让您的示例几乎无需修改。这让我做了你所描述的事情:

before do
  @prefix = "test"
end

get %r{#{@prefix}(\d+)} do |c|
  puts "#{@prefix} #{c}"
  erb :test, :locals => {:id => c}
end
然后我运行了霰弹枪来测试输出并调用/ test123。输出是:

测试123

我的观点还重申,这是正常的。如果问题是没有捕获URL,您可能需要重新组织结构,使其更像:

before do
  @prefix = "test"
end

get "/#{@prefix}/:id" do
  puts "#{@prefix} #{params[:id]}"
  erb :test, :locals => {:id => params[:id]}
end

我不知道后者是否适用于您的应用程序,但如果您在路由方面不够具体,那么您可能会因为频繁的不匹配而离开自己。根据我的经验,您的应用程序越RESTful,在编写这些类型的操作时,您将获得更好的效果。

或者,也许用于存储设置的YAML文件,然后由脚本解析将为您提供更好的路由结果。例如,包含以下内容的YAML文件:

prefix: test

然后是一个解析它的帮助脚本,它看起来像这样:

helpers do
  def config
    @config = YAML.load_file("config.yml")
  end
end

然后您可以用以下内容替换之前的块:

before do
  @prefix = config["prefix"]
end

我的编码品味让我倾向于使用YAML方法,但我认为任何这些解决方案都应该是可行的。

答案 1 :(得分:2)

立即生成String / Regexp。这有效:

require 'sinatra'
set :prefix, '/foo'

get "#{settings.prefix}/bar" do
  request.path_info
end