使用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”文件。
答案 0 :(得分:0)
我认为不存在对模板的任何自动检测,也没有“标准”的方式来做您想要的事情。 Sinatra的markown
或erb
之类的渲染方法只是一堆单行包装器,围绕着更通用的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
,您可以避免对原始模板类型感到困惑。