Ruby Sinatra找不到视图目录
我正试图以一种更类似于普通Ruby Gem结构的方式构造我的Sinatra应用程序。我有以下文件树:Ruby Sinatra找不到视图目录,ruby,gem,sinatra,runtime-error,Ruby,Gem,Sinatra,Runtime Error,我正试图以一种更类似于普通Ruby Gem结构的方式构造我的Sinatra应用程序。我有以下文件树: . ├── app.rb ├── config.ru ├── Gemfile ├── Gemfile.lock ├── helpers │ ├── dbconfig.rb │ ├── functions.rb │ └── init.rb ├── hidden │ └── Rakefile ├── lib │ ├── admin.rb │ ├── api.rb │ ├─
.
├── 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::enoint-没有这样的文件或目录-/home/dev/indexer/lib/views/index.erb
令人不快的几行是:
get '/' do
erb :index
end
如何修复此问题?在配置块中指定视图目录的路径:
set :views, "#{settings.root}/../views"
查看如果不查看
rb
文件的内容,就很难猜出错误。如果在应用程序根目录下的子文件夹中的rb
文件中定义了路由,则必须显式设置views
文件夹
在您的情况下,假设/app.rb
是设置基本配置的文件,则必须在其中设置视图(或其他类似公用文件夹的内容)
class MyApp < Sinatra::Base
set :views, File.dirname(__FILE__) + '/views'
set :public_folder, File.dirname(__FILE__) + '/public'
end
好吧,我发现了问题所在!我所需要做的就是让lib/
文件夹中的类继承自主Brightswipe
类,该类继承自Sinatra::Base
,我在app.rb
(并非唯一)中的Brightswipe
类,以及models
文件夹中的Brightswipe
类的各个模块(我想是?),像Brightswipe::Main
和Brightswipe::API
,等等。我只是将语句放在我的app.rb
-中,它失败了,出现了相同的错误。从“模板被假定直接位于./views目录下。”您不必指定此选项,但如果指定,则应该是set:views,./views”
,我建议您以任何一种方式设置:root,File.dirname(\uuuu File\uuuu)
@iain,我从app.rb
设置root和views文件夹,它位于项目根目录中,但没有用。既然我不只是拥有相同的类Brightswipe
(我使用Brightswipe::Main
,Brightswipe::API
,等等),那会有所不同吗?这解决了我的问题,但为什么?使用ruby app.rb工作正常,但unicorn显示了错误。当添加此选项时,@CodeGnome的可能副本不起作用,并且不太相关。顺便说一句,我见过的大多数Sinatra项目倾向于将所有特定于应用程序的代码放在项目根目录下的应用程序中,因此在您的情况下视图,公共,模型
和助手
将位于应用程序
目录下<代码>库保持在项目根目录下。你在lib
目录中的所有应用程序代码都将在app
中。应用程序不是库,因此布局不同。@iain,好吧,这是有道理的,但在我看来,Sinatra正在查看lib/views
,因为核心代码在lib
中,如果您在第一个需要的文件中进行了子类化,则不需要在随后需要的文件中表达子类。Hmmm。。。如果我有Brightswipe::Main
和Brightswipe::API
等等,这会起作用吗?或者我应该在每一个里面都有这个代码吗?这正是上面答案中所说的。
class MyApp < Sinatra::Base
get "/blah" do
"blah blah"
end
end