我有一个采用以下方法的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”
谢谢。
编辑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
方法从未在路由中被调用,仅在其中一个视图中的商品对象上被调用,因此没有错误。
答案 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">