我正在使用Sinatra和Heroku建立一个简单的“笔记”网站。我使用Markdown编写笔记,并使用rdiscount gem将它们转换为Sinatra中的HTML。因此,对/ foo的请求将提供模板/views/foo.md,转换为HTML
我还希望能够将Markdown源作为纯文本文件提供。所以/ 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
答案 0 :(得分:3)
简短回答:使用File.read
来吸收文件的内容,然后用它做你想做的事:
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
答案 1 :(得分:0)
通过稍微搜索,我设法使用send_file:
get '/:topic/source' do
send_file File.dirname(__FILE__) + "/views/#{params[:topic]}.md", :type => :text
end
但是我想相信那里有一个更优雅的解决方案,所以现在暂时保持这个问题。
答案 2 :(得分:-1)
您可以尝试使用str
模板:
get '/:topic/source' do
str params[:topic].to_sym
end
唯一需要考虑的是,它会尝试插入值,就像使用字符串一样 - 换句话说,它会尝试用#{foo}
替换foo.to_s
。这可能是也可能不合适。
免责声明:我不确定它是否有效,我不得不通过查看Tilt的源代码推断出这一功能,而我还没有对其进行测试。
编辑:我担心这不起作用。可以像这样定义str方法:helpers do
def str(*args) render(:str, *args) end
end
Tilt引擎尝试查找名为'foo.str'的视图,而不是使用'foo.md'。我也尝试将'md'注册为StringTemplate的有效扩展,但它不起作用(我将markdown呈现为字符串,或者我有与以前相同的错误。
对不起。