【问题标题】:Sinatra cannot find views directorySinatra 找不到视图目录
【发布时间】:2013-01-04 05:41:59
【问题描述】:

我正在尝试以更类似于普通 Ruby Gem 结构的方式构建我的 Sinatra 应用程序。我有以下文件树:

.
├── app.rb
├── config.ru
├── Gemfile
├── Gemfile.lock
├── helpers
│   ├── dbconfig.rb
│   ├── functions.rb
│   └── init.rb
├── hidden
│   └── Rakefile
├── lib
│   ├── admin.rb
│   ├── api.rb
│   ├── indexer.rb
│   ├── init.rb
│   └── magnet.rb
├── models
│   ├── init.rb
│   ├── invite.rb
│   ├── tag.rb
│   ├── torrent.rb
│   └── user.rb
├── public
│   ├── css
│   │   ├── reset.css
│   │   └── style.css
│   ├── i
│   ├── img
│   │   ├── bg.jpg
│   │   ├── dl-icon.png
│   │   ├── logo.png
│   │   ├── logo-public.png
│   │   ├── magnet-icon.png
│   │   ├── text-logo.png
│   │   ├── text-logo-public.png
│   │   └── upload-icon.png
│   └── js
│       ├── main.js
│       └── torrents.js
├── README.md
├── SPEC.md
├── tmp
│   └── restart.txt
├── TODO.md
└── views
    ├── error.erb
    ├── footer.erb
    ├── header.erb
    ├── index.erb
    ├── list.erb
    ├── nav.erb
    ├── text.erb
    └── upload.erb

我有应用程序文件尝试在 lib/ 中呈现内容,但在(重新)启动乘客服务器时,我得到:Errno::ENOENT - No such file or directory - /home/dev/indexer/lib/views/index.erb

有问题的几行是:

get '/' do
  erb :index
end

我该如何解决这个问题?

【问题讨论】:

  • @CodeGnome 不起作用,而且不是很相关
  • 顺便说一句,我见过的大多数 Sinatra 项目倾向于将所有特定于应用程序的代码放在项目根目录下的 app 目录中,所以在你的情况下是 viewspublic、@ 987654329@ 和 helpers 将在 app 目录下。 lib 保留在项目根目录下。您在lib 目录中拥有的所有应用程序代码都将在app 中。应用程序不是库,因此布局不同。
  • @iain,好吧,这是有道理的,但在我看来,Sinatra 正在寻找 lib/views,因为核心代码在 lib

标签: ruby gem sinatra runtime-error


【解决方案1】:

如果不查看rb 文件的内容,就很难猜出哪里出了问题。如果您的路由是在应用程序根目录下的子文件夹中的rb 文件中定义的,则必须显式设置views 文件夹。

在您的情况下,假设/app.rb 是设置基本配置的文件,您必须在其中设置views(或其他任何类似公共文件夹)。

class MyApp < Sinatra::Base
  set :views, File.dirname(__FILE__) + '/views'
  set :public_folder, File.dirname(__FILE__) + '/public'
end

Else Sinatra 将在后续子文件夹中查找相关路径。此外,后续的路由文件应该扩展相同的类。在这种情况下,MyApp。例如,在./lib/admin.rb

class MyApp < Sinatra::Base
  get "/blah" do
    "blah blah"
  end
end

【讨论】:

  • 如果您在第一个所需文件中进行了子类化,则无需在后续所需文件中表达子类。
  • 嗯...如果我有Brightswipe::MainBrightswipe::API 等等,这会起作用吗?或者我应该在每一个中都有这段代码?
【解决方案2】:

在配置块中指定视图目录的路径:

set :views, "#{settings.root}/../views"

http://www.sinatrarb.com/configuration.html#__view_template_directory

【讨论】:

  • 我的app.rb 中有gist.github.com/4584262(不是单独的),以及models 文件夹中Brightswipe 类的各种模块(我认为?),例如Brightswipe::Main 和@ 987654329@ 等。我只是将这些语句放在我的 app.rb 中 - 它失败并出现同样的错误。
  • 来自the docs "模板假定直接位于 ./views 目录下。"你不应该指定这个选项,但如果你这样做了,那么它应该是set :views, "./views",我建议无论哪种方式你都这样做set :root, File.dirname(__FILE__)
  • @iain,我从项目根目录中的app.rb 设置了根目录和视图文件夹 - 但无济于事。因为我不只是有相同的课程Brightswipe(我使用Brightswipe::MainBrightswipe::API 等),这会有什么不同吗?
  • 这解决了我的问题,但为什么呢?使用 ruby​​ app.rb 工作正常,但独角兽显示错误。添加后它可以工作
【解决方案3】:

好的,我发现了问题所在!我需要做的就是让lib/ 文件夹中的类继承自Brightswipe 主类,后者继承自Sinatra::Base

【讨论】:

  • N 这正是上面答案中所说的。
猜你喜欢
  • 1970-01-01
  • 2011-01-08
  • 2021-03-24
  • 2021-10-31
  • 2020-05-28
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 2013-03-06
相关资源
最近更新 更多