【问题标题】:use parameters in routes definition in sinatra在 sinatra 的路由定义中使用参数
【发布时间】:2011-11-11 21:17:38
【问题描述】:

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

我想要实现的是:

http://fooo.bar/prefix1234

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

很简单:

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

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

settings.rb: 设置:前缀,'pre'

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

这不起作用(Sinatra::Application:Class (NoMethodError) 的未定义方法“前缀”)。我还尝试使用正则表达式进行捕获:

before do
 @prefix = settings.prefix
end

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

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

有人收到了吗?

【问题讨论】:

  • 如果在 Sinatra 中路由的处理方式与在 rails 中的处理方式相同(从上到下),您可以将类似 /* 的路由定义为最后一个匹配任何内容的路由。
  • 这也不是我正在寻找的解决方案,因为我想处理前缀不同于任何其他 URL 的 URL

标签: ruby sinatra


【解决方案1】:

我几乎无需修改就能让您的示例正常工作。这让我可以做你描述的事情:

before do
  @prefix = "test"
end

get %r{#{@prefix}(\d+)} do |c|
  puts "#{@prefix} #{c}"
  erb :test, :locals => {:id => c}
end

然后我运行 shotgun 来测试输出并调用 /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 方法,但我认为这些解决方案中的任何一个都应该是可行的。

【讨论】:

  • 感谢您的建议。然而,只有第一个是可行的,不幸的是这个不工作(完全)。是的,如果你确实得到“/test123”,那么 URL 将被捕获。但是当您执行 get "/something123" 时,URL 也会被捕获。在我看来,变量@prefix 在路由中始终为空
【解决方案2】:

字符串/正则表达式立即生成。这有效:

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

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

【讨论】:

  • 我试过了,效果很好。但是我很确定我之前尝试过...奇怪
  • 好的对不起,我记得问题出在哪里:使用这段代码,我所有的测试都运行良好,但是当我启动应用程序时,我收到以下错误:undefined method `prefix' for Sinatra::Application:Class (NoMethodError)
  • 如 Sinatra 票证中所述:您必须在 加载路线之前设置该设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 2014-03-17
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多