Ruby slim尝试从错误路径渲染模板

Ruby slim尝试从错误路径渲染模板,ruby,sinatra,slim-lang,Ruby,Sinatra,Slim Lang,我是ruby世界的新手,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 e

我是ruby世界的新手,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
结束

因此,我的文件夹结构如下所示:

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
...
我得到了这个错误:
没有这样的文件或目录@rb_sysopen-/Users/rolandjitsu/Projects/Products/pulsr/controllers/views/index.slim
其中模板实际上是以一个级别放在
views
文件夹中的


以前我在
app.rb
文件中有所有的代码,而且正常情况下,它是有效的,但是现在我不确定如何解决这个路径问题。

您已经将您的
Routes
类设置为一个独立于主应用程序的Sinatra应用程序,这意味着它有自己的设置,不共享。因此,
路由
应用程序的视图文件夹是该应用程序的默认文件夹,即
控制器
目录中的
视图
目录

解决此问题的简单方法是在
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

然后在主应用程序中调用
注册路由
,而不是
使用路由
。这需要做的工作稍微多一些,但给了您更多的灵活性。

我想这一定是设置的问题,因为我在我的
routes.rb
文件中尝试了类似于
set:views,File.expand\u path(File.join(\uu File\uu,../views'))
的东西,似乎我遇到了新的错误,但无法解析路径的错误已经消失。我想我更喜欢你的第二种方式。我之所以拆分文件,是因为我试图实现一种类似于MVC的体系结构。没错,我没有制作几个单独的应用程序,它只是一个,所有路由都将解析为索引,因为我将使用angular导航页面。@rolandjitsu我在回答中没有提到的东西:在你的问题中,你有
set:views,File.join(:root.to.'s,'views')
,这是错误的–它将生成
根/视图
。您可能打算使用应用程序根目录设置。默认值是
视图
,因此您根本不需要该行。是的,我认为
:root
将为我提供应用程序路径的根。有没有其他方法可以获取该字符串并附加所需的字符串?实际上,我的视图不需要它,但我的静态资产需要它,因为它们将位于默认的
public
one@rolandjitsu只需使用
root
(即no
)。设置作为类范围内的方法提供,在路由内,您需要使用
设置。root
@rolandjitsu另一个选项是从不同的文件重新打开主应用程序类,并向其中添加路由等。以另一个问题为例:
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