Ruby 如何让Sinatra以HTML的形式提供降价,以及以纯文本的形式提供源代码?
我正在使用Sinatra和Heroku构建一个简单的“notes”站点。我使用Markdown来写笔记,并使用RDisont gem将它们转换为Sinatra中的HTML。因此,对/foo的请求将提供转换为HTML的模板/views/foo.md 我还希望能够将降价源作为纯文本文件提供。因此/foo/source(或类似的东西)将把/views/foo.md作为纯文本服务器 我尝试过使用ERB,但它最终只想服务/views/foo.ERB 以下是我当前的应用程序: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
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引擎进行布局”我在任何地方都看不到任何布局。这是不是把你搞砸了?