我已经尝试了几个小时,但仍无法按照我想要的方式配置路线。
我想要实现的目标是:
我想捕获以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)
有人得到了什么吗?
答案 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