我是红宝石世界的新手,还有Sinatra,所以我别无选择,只能在这里询问我一直在犯的错误。
我正在使用Rack + Sinatra和Slim的组合作为模板引擎。我的app.rb
设置为:
module Pulsr
class StylusHandler < Sinatra::Base
set :views, File.dirname(__FILE__) + '/stylus'
get '/css/styles.css' do
stylus :styles
end
end
class Application < Sinatra::Base
register Sinatra::ConfigFile
config_file './config/config.yml'
use Pulsr::Api
use Pulsr::Routes
enable :logging, :dump_errors if Sinatra::Base.development?
disable :method_override, :run
set :public_folder, File.join(:root.to_s, 'static')
set :views, File.join(:root.to_s, 'views')
#set :static_cache_control, [:public, max_age: 60 * 60 * 24 * 365] if Sinatra::Base.production?
end
端
Pulsr::Api
和Pulsr::Routes
位于子目录中的两个不同文件中。我遇到的问题是,slim尝试相对于routes文件的路径呈现模板,如下所示:
module Pulsr
class Routes < Sinatra::Base
get '/*' do
slim :index
end
end
端
所以,我的文件夹结构如下所示:
- config
- config.yml
...
- controllers
- routes.rb
- views
- index.slim
- app.rb
- config.ru
- Gemfile
...
我收到此错误:No such file or directory @ rb_sysopen - /Users/rolandjitsu/Projects/Products/pulsr/controllers/views/index.slim
其中模板实际放置在views
文件夹中的一级。
在我拥有app.rb
文件中的所有代码之前,通常情况下,它有效,但现在我不确定如何修复此路径问题。
答案 0 :(得分:2)
您已将Routes
类设置为主应用程序中的单独Sinatra应用程序,这意味着它有自己的设置,不会共享。因此,Routes
应用的views文件夹是该应用的默认,它是views
目录中的controllers
目录。
修复它的简单方法是在views
类中指定Routes
目录。
module Pulsr
class Routes < Sinatra::Base
# add this line
set :views, File.expand_path(File.join(__FILE__, '../../views'))
get '/*' do
slim :index
end
end
您还可以将app_file
设置为主应用文件,然后根据该设置设置views
,root
和public_folder
设置。
看起来您实际上并不打算创建多个单独的应用程序,而是将您的单个应用程序拆分为多个文件。可能更好的方法是使用extensions
。您可以创建一个包含可以包含在主应用程序中的路径的模块,它们将使用与主应用程序相同的设置。
module Routes # N.B modle not class
# in this method you can add routes to the main app
def self.registered(app)
# you need to use 'app.get', not plain 'get'
app.get '/*' do
slim :index
end
end
end
然后在您的主应用中调用register Routes
而不是use Routes
。这稍微需要设置一些工作,但为您提供了更大的灵活性。