2014-02-16 3 views
0

저는 Ruby 세계와 Sinatra를 처음 접했으므로 계속해서 오류를 묻는 것 외에 다른 선택의 여지가 없습니다.slim이 잘못된 경로에서 템플릿을 렌더링하려고 시도합니다.

나는 템플릿 엔진으로 Slim과 Rack + Sinatra의 조합을 사용하고 있습니다. 나는이 같은 내 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 디렉토리 인 해당 애플리케이션의 기본값은 입니다.

클래스에 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 

당신은 또한에 근거하여 views, rootpublic_folder 설정은 모두 다음으로 설정됩니다 주요 응용 프로그램 파일이어야하는 app_file을 설정할 수 있습니다.

실제로 여러 개의 개별 응용 프로그램을 만들지 않고 단일 응용 프로그램을 여러 파일로 분할하는 것처럼 보입니다. 더 나은 방법은 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/views '))'와 같은 것을 시도했기 때문에 설정이 있어야한다고 생각했습니다. rb' 파일에 새 오류가있는 것처럼 보였지만 경로를 확인할 수 없다는 오류가 사라졌습니다. 나는 당신이 더 잘 게시 한 두 번째 방식을 좋아한다고 생각합니다. 파일을 분할하는 이유는 MVC와 비슷한 아키텍처를 구현하려고하기 때문입니다. 사실, 여러 별도의 응용 프로그램을 만들지 않고 있습니다. 하나만 있어도 모든 경로가 색인으로 변환됩니다. 페이지를 탐색 할 때 각도를 사용하기 때문입니다. – Roland

+0

@rolandjitsu 나는 내 대답에 언급하지 않은 것 : 귀하의 질문에 당신은'set : views, File.join (: root.to_s, 'views')'이 잘못되어'root/views'가 생성됩니다. 아마도 앱 루트 설정을 사용하려고했을 것입니다. 어쨌든 기본값은'views'이므로, 그 라인을 전혀 필요로하지 않아야합니다. – matt

+0

네, 저는': root'가 내 앱 경로의 루트를 줄 것이라고 생각했습니다. 그것을 얻고 필요한 문자열을 추가하는 또 다른 방법이 있습니까? 실제로 필자는 내 견해가 필요하지 않지만 기본 'public'이 아닌 다른 폴더에있을 것이기 때문에 내 정적 자산을 필요로합니다. – Roland

관련 문제