【问题标题】:Sinatra rendering .md.erb templates, if present, otherwise .mdSinatra 呈现 .md.erb 模板(如果存在),否则呈现 .md
【发布时间】:2018-06-07 13:04:43
【问题描述】:

使用 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

Rescue Errno::ENOENT 看起来不优雅。此外,在我用“.md”指定名称以便它获取“.md.erb”文件的地方,代码也令人困惑。

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:

    我认为没有任何类型的模板自动检测存在,也没有“标准”方式来做你想做的事。 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,您可以避免对原始模板类型的混淆。

    【讨论】:

    • 啊,是的,我想过这样做,但是在框架之外构建自己的文件路径也感觉不优雅。我猜最好避免异常流。 ...无论如何,你已经回答了我的问题,因为没有更多的内置 sinatra 方法可以做这件事。
    猜你喜欢
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2023-01-13
    • 1970-01-01
    • 2012-01-02
    • 2020-06-08
    相关资源
    最近更新 更多