Ruby 如何让Sinatra以HTML的形式提供降价,以及以纯文本的形式提供源代码?

Ruby 如何让Sinatra以HTML的形式提供降价,以及以纯文本的形式提供源代码?,ruby,sinatra,markdown,Ruby,Sinatra,Markdown,我正在使用Sinatra和Heroku构建一个简单的“notes”站点。我使用Markdown来写笔记,并使用RDisont gem将它们转换为Sinatra中的HTML。因此,对/foo的请求将提供转换为HTML的模板/views/foo.md 我还希望能够将降价源作为纯文本文件提供。因此/foo/source(或类似的东西)将把/views/foo.md作为纯文本服务器 我尝试过使用ERB,但它最终只想服务/views/foo.ERB 以下是我当前的应用程序: require 'sinatr

我正在使用Sinatra和Heroku构建一个简单的“notes”站点。我使用Markdown来写笔记,并使用RDisont gem将它们转换为Sinatra中的HTML。因此,对/foo的请求将提供转换为HTML的模板/views/foo.md

我还希望能够将降价源作为纯文本文件提供。因此/foo/source(或类似的东西)将把/views/foo.md作为纯文本服务器

我尝试过使用ERB,但它最终只想服务/views/foo.ERB

以下是我当前的应用程序:

require 'sinatra'
require 'rdiscount'

set :markdown, :layout_engine => :erb

get '/' do
  markdown :index
end

get '/:topic' do
  markdown params[:topic].to_sym
end

通过进一步搜索,我成功地使用send_文件使其正常工作:

get '/:topic/source' do
  send_file File.dirname(__FILE__) + "/views/#{params[:topic]}.md", :type => :text
end

但是我想相信还有一个更优雅的解决方案,所以现在就把问题留给大家。

您可以尝试使用
str
模板:

get '/:topic/source' do
  str params[:topic].to_sym
end
唯一需要考虑的是,它将尝试像使用字符串一样插入值-换句话说,它将尝试用
foo.to
替换
{foo}
。这可能是可取的,也可能不是可取的

免责声明:我不确定它是否会工作,我必须通过查看的源代码来推断此功能,但我还没有测试它

编辑:恐怕不行。可以这样定义str方法:

helpers do
  def str(*args) render(:str, *args) end
end
倾斜引擎尝试查找名为“foo.str”的视图,而不是使用“foo.md”。我还尝试将'md'注册为StringTemplate的有效扩展,但没有成功(我要么将标记呈现为字符串,要么出现与以前相同的错误)


抱歉。

简短回答:使用
文件。阅读
以插入文件内容,然后对其执行所需操作:

get '/topic/:topic'
    markdown File.read(params[:topic] + ".md")
end
回答很长:Sinatra可能会因为点、冒号和文件类型而变得愚蠢,所以你可能不得不控制参数。下面的Sinatra应用程序(工作!)可能有助于演示

require 'rubygems'
require 'sinatra'

get '/' do  
  markdown <<-MARKDOWN
# Markdown in Sinatra
* [markdown](/notes)
* [plain text](/notes.txt)
* [pre html](/notes.html)
  MARKDOWN
end

def source
  parts = params[:base].split('.')
  name = parts.first
  ext = parts.last
  filename = name  + ".md"
  source = File.read(filename)
  puts "filename=" + filename.inspect
  puts "source=" + source.inspect
  source
end

get '/:base.txt' do
  source
end

get '/:base.html' do
  "<pre>#{source}</pre>"
end

get '/:base' do
  markdown source
end
需要“rubygems”
需要“sinatra”
获取“/”do

生成错误的标记:未定义的#方法'str'。我猜我还需要使用另一种语法。仍在尝试解决它。尝试了更多内容,并添加到我的答案中。但是,没有任何效果:/感谢您的查看。现在我的上面的答案起作用了。您想得太多了。如果您想要的是原始文本,请获取raSinatra是Ruby!请看我的完整答案,但这行可能会把你搞砸:“set:markdown,:layout\u engine=>:erb”--“layout\u engine”选项中的“layout”使用Rails定义的“layout”作为“页面包装器”,如“在呈现标记模板时使用erb引擎进行布局”我在任何地方都看不到任何布局。这是不是把你搞砸了?