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

时间:2014-02-16 14:12:05

标签: ruby sinatra slim-lang

我是红宝石世界的新手,还有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 个答案:

答案 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设置为主应用文件,然后根据该设置设置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。这稍微需要设置一些工作,但为您提供了更大的灵活性。