2014-02-16 34 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