使用Sinatra列出目录中的文件时出错

时间:2013-06-20 08:31:33

标签: css ruby directory sinatra

我正在尝试遵循这个Sinatra教程(从2008年开始):
http://devver.wordpress.com/2008/11/25/building-a-iphone-web-app-in-under-50-lines-with-sinatra-and-iui/

但遇到代码的一些问题,对我来说,目前主要标题下没有列出文件。当我将dir更改为"./public/files/"时,会显示列表,但单击文件的链接会导致出现错误页面(“Sinatra不知道这个小曲”)。如果我从网址中删除public,那么在这种情况下它将起作用。我怎么解决这两个问题?

另外,如果使用“use_in_file_template!”行我会收到错误,我只是注释掉了。 我不熟悉CSS,所以有人能告诉我文本的颜色在哪里吗?


require 'rubygems'
require 'sinatra'
require 'pathname'

get "/" do
  dir = "./files/"
  @links = Dir[dir+"*"].map { |file|
    file_link(file)
  }.join
  erb :index
end

helpers do

  def file_link(file)
    filename = Pathname.new(file).basename
    "<li><a href='#{file}' target='_self'>#{filename}</a></li>"
  end

end

use_in_file_templates!

__END__

@@ index
<html>
  <head>
    <meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>
    <style type="text/css" media="screen">@import "/stylesheets/iui.css";</style>
    <script type="application/x-javascript" src="/javascripts/iui.js"></script>
  </head>

  <body>
    <div class="toolbar">
    <h1 id="pageTitle"></h1>
    </div>
    <ul id="home" title="Your files, sir." selected="true">
       <%= @links %>
    </ul>
  </body>

</html>

1 个答案:

答案 0 :(得分:2)

嗯,sinatra(和许多其他Web服务器一样)假设public是静态文件的根目录,并且在访问文件/目录时它不会使用它。因此,在您的情况下,您可以更改(在获取文件列表时将public添加到路径并在生成链接时将其删除)代码中的某些行:

get "/" do
  dir = "public/files/"
  @links = Dir[dir+"*"].map { |file|
    file_link(file)
  }.join
  erb :index
end

helpers do
  def file_link(file)
    filename = Pathname.new(file).basename
    "<li><a href='#{file.sub('public','')}' target='_self'>#{filename}</a></li>"
  end
end