Mustermann :: CompileError в URL - PullRequest
       8

Mustermann :: CompileError в URL

0 голосов
/ 27 августа 2018

У меня есть блог на 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. Почему это так сильно ограничивает генерируемые строки, которые даже не являются маршрутами Синатры?
  3. Как мне избавиться от этой проблемы?

Спасибо.

РЕДАКТИРОВАТЬ 29.08.2018: Оказывается, Синатра / Мустерманн блокировали эти строки, потому что они были маршрутами.Основной метод создания динамических маршрутов статей был таким:

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 никогда не вызывается на маршруте, только на объекте articleт в одном из представлений - следовательно, без ошибок.

1 Ответ

0 голосов
/ 28 августа 2018

Помощники маршрута Sinatra и сам Mustermann не принимают полные URL-адреса в качестве шаблонов, а только пути - вы не можете в них указывать имена хостов. README от Mustermann предоставляет полный список поддерживаемых типов паттернов, и все примеры там показывают пути. Как вы это назвали, «ограничительное» поведение является нормальным, поскольку это не универсальная библиотека сопоставления с образцом - она ​​специально предназначена для обработки путей URL.

Если вы не хотите указывать имя хоста для маршрута Синатра, вы можете сделать это с необязательным параметром 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">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...