Sinatra渲染.md.erb模板(如果存在),否则为.md

时间:2018-06-07 13:04:43

标签: ruby sinatra

使用sinatra,我可以告诉它渲染降价模板,例如view / my_template.md传递模板名称,如下所示:markdown :my_template

但我想首先通过erb处理,所以我的文件名为view/my_template.md.erb

但是......我也想让我的代码以任何一种方式工作。我希望它使用.md.erb文件(如果存在),否则使用.md文件。

我想知道在sinatra中是否有标准的方法,而不是自己编写这个后备的逻辑。以下作品,但似乎不优雅:

get '/route/to/my/page' do
  begin
    # Try to do erb processing into a string with the file view/my_template.md.erb
    md_content = erb :my_template.md, :layout => false
  rescue Errno::ENOENT
    # Set it to use the view/my_template.md file instead
    md_template = :my_template
  end
  # Either way we do the markdown rendering and use the erb layouts
  markdown md_content || md_template, :layout_engine => :erb, :renderer => MARKDOWN_RENDERER
end

救援Errno :: ENOENT似乎不优雅。此外,代码令人困惑,我指定一个带有“.md”的名称,以便它获取“.md.erb”文件。

1 个答案:

答案 0 :(得分:0)

我认为不存在对模板的任何自动检测,也没有“标准”的方式来做您想要的事情。 Sinatra的markownerb之类的渲染方法只是一堆单行包装器,围绕着更通用的render方法,该方法仅按其名称说明。

对于您而言,手动检测首选模板及其类型应该很简单,并且不需要引发异常。

get '/route/to/my/page' do
  tpl_path = Dir.glob('views/my_template.md{,.erb}').sort.last
  tpl_name = File.basename(tpl_path, '.*').to_sym
  tpl_type = File.extname(tpl_path)

  erb_output = erb(tpl_name) if tpl_type == '.erb'
  markdown(erb_output || tpl_name)
end

Dir.glob将在my_template.md.erb上选择my_template.md。此外,借助tpl_type,您可以避免对原始模板类型感到困惑。