首页 文章

slim试图从错误的路径渲染模板

提问于
浏览
0

我是红宝石世界的新手,还有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::ApiPulsr::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 文件中的所有代码之前,通常它可以工作,但现在我不确定如何修复此路径问题 .

1 回答

  • 1

    您已将 Routes 类设置为主应用程序中的单独Sinatra应用程序,这意味着它具有自己的不共享设置 . 因此, Routes app的views文件夹是该应用程序的默认文件,即 controllers 目录中的 views 目录 .

    修复它的简单方法是在 Routes 类中指定 views 目录 .

    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设置为主应用程序文件,然后将基于此设置 viewsrootpublic_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 . 这稍微需要设置,但为您提供更多灵活性 .

相关问题