URL中的Mustermann :: CompileError

时间:2018-08-27 11:24:50

标签: ruby string url sinatra

我有一个采用以下方法的Sinatra博客:

module Tir
  module Blog
    class Article

      def url
        [Tir::Config.domain, meta('relative_path')].join
      end

    end
  end
end

在Article实例上调用它会输出文章的完整URI,例如:

"http://example.com/2018/07/08/test-article"

惊人的Mustermann给我以下错误:

  

Mustermann :: CompileError:捕获名称不能为空:“ / http://example.com/2018/07/08/test-article

  1. 为什么在字符串的开头插入正斜杠?
  2. 为什么如此严格的wrt生成的字符串甚至不是Sinatra路由?
  3. 如何摆脱这个问题?

谢谢。

编辑29.08.2018: 事实证明,Sinatra / Mustermann阻止了这些字符串,因为它们路线。我生成动态文章路线的主要方法是:

articles = []

Dir.glob('articles/*.mdown') do |file|
 article = initialize_article file
 if article.ready?
   get("/#{article.url}") do
    erb :'articles/article',
    :locals => { :article => article },
    :layout => :'articles/layout_article'
   end
   articles << article
 end
end

改进的版本在get块中使用了不同的方法:

#articles.rb

articles = []

Dir.glob('articles/*.mdown') do |file|
 article = initialize_article file
 if article.ready?
   get("/#{article.relative_path}") do
    erb :'articles/article',
    :locals => { :article => article },
    :layout => :'articles/layout_article'
   end
   articles << article
 end
end

方法定义:

#blog.rb

def relative_path
 meta('relative_path')
end

def url
 [Tir::Config.domain, meta('relative_path')].join
end

所以现在url方法从未在路由中被调用,仅在其中一个视图中的商品对象上被调用,因此没有错误。

1 个答案:

答案 0 :(得分:1)

Sinatra路由助手和Mustermann本身不接受完整的URL作为模式,仅接受路径-您不能在其中添加主机名。 Mustermann的README提供了受支持的模式类型的完整列表,所有示例均显示路径。正如您所说的,“限制性”行为是正常现象,因为它不是通用模式匹配库-它专门用于处理URL路径。

如果您不想为Sinatra路由指定主机名,则可以使用可选的host_name参数。

get '/2018/07/08/test-article', host_name: 'example.com' do
  erb :article  
end

如果您想使用Mustermann进行自定义匹配,则文档中列出的uri-template模式类型可以使用完整的URL。您将必须安装mustermann-contrib gem,并掌握略有不同的模式语法。

irb(main):011:0> require 'mustermann'
=> true
irb(main):012:0> pattern = Mustermann.new("http://example.com/2018/07/08/{slug}", type: 'uri-template')
=> #<Mustermann::Template:"http://example.com/2018/07/08/{slug}">
irb(main):013:0> pattern.match "http://example.com/2018/07/08/test-article"
=> #<MatchData "http://example.com/2018/07/08/test-article" slug:"test-article">