2014-02-16 39 views
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在子目录中的两个不同的文件。我的问题是,苗条试图相对路径文件的路径,它看起来像这样的模板呈现:

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

您已将您的Routes类设置为独立的Sinatra应用程序与您的主应用程序,这意味着它具有不共享的自己的设置。 Routes应用程序的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。这是稍微多一些的工作,但给你更多的灵活性。

+0

我觉得它必须是设置的东西,因为我在''路由中尝试了'set:views,File.expand_path(File.join(__ FILE__,'../../ views'))''。 rb'文件,似乎我得到了一个新的错误,但关于不能解决路径的错误消失了。我想我喜欢你发布更好的第二种方式。我分裂文件的原因是因为我试图实现类似于MVC的体系结构。诚然,我没有做出几个单独的应用程序,它只是一个,所有路线都将解析为索引,因为我将使用角度来浏览页面。 – Roland

+0

@rolandjitsu在我的回答中没有提到的东西:在你的问题中,你有'set:views,File。加入(:root.to_s,'views')',这是错误的 - 它会产生'root/views'。您可能打算使用应用程序根目录设置。无论如何,默认是'views',所以你根本不需要那条线。 – matt

+0

是的,我认为':root'会给我我的应用程序路径的根。有没有另外一种方法来获取并追加所需的字符串?事实上,我并不需要它为我的看法,但我确实需要它为我的静态资产,因为他们将在比默认的另一个文件夹'public'一个 – Roland