3

2.3.11에서 Rails 3.1 로의 업그레이드를 위해 노력해 왔습니다. 해결해야 할 주요 장애물 중 하나는 자산 파이프 라인으로 변환하는 것입니다. 이 과정에서 나는 CSS를 sass (scss)로 변환하기로 결정했다. 레일즈 3.1에서 파이프 라인을 통해 전달 된 모든 애셋은 프로덕션에서 파일 이름에 추가 된 해시를받습니다. 이 때문에 내 CSS에서 참조 된 모든 이미지는 이제 sass에서 image-path 또는 image-url 도우미를 사용해야합니다. 내 environment.rb 파일에서 내 ENV [ 'RAILS_RELATIVE_URL_ROOT']을 설정했지만 sass asset helper가 relative_url_root를 포함하지 못하는 문제가 있습니다. 그냥 선명도레일 3.1 RAILS_RELATIVE_URL_ROOT/relative_url_root를 포함하지 않는 SASS 자산 도우미

, 레일 3.1에서 relative_url_root를 추가, 내 environment.rb에 파일에 다음 줄을 추가 :

ENV['RAILS_RELATIVE_URL_ROOT'] = '/foo' 

내 가상 호스트에 다음 줄을 추가합니다 :

RailsBaseURI /foo 

이 전략은 모든 링크 등에서 정상적으로 작동하는 것으로 보입니다. 그것은 제대로 작동하지 않는 것 같은 헛소리의 자산 조력자 일뿐입니다. 어떤 아이디어라도 감사 할 것입니다.

+0

여기에 관련된 질문이 있습니다. 정확히 동일하지는 않지만 하나에 대한 대답은 두 가지 모두를 도울 수 있습니다. http://stackoverflow.com/questions/7293918/broken-precompiled-assets-in-rails-3-1-when-deploying-to-a-sub -uri –

+0

https://github.com/rails/rails/pull/2977 곧 레일의 Sprockets :: RailsHelper :: AssetPaths 클래스에서 수정 될 것입니다. –

+0

Google 직원은 http://stackoverflow.com/questions/7293918/broken-precompiled-assets-in-rails-3-1-when-deploying-to-a-sub-uri/12122877#12122877에서 내 대답을 참조하십시오. –

답변

3

주위를 파고 들자면 문제를 발견했습니다. 문제는 Rails, 특히 Sprockets :: Helpers :: RailsHelper :: AssetPaths # compute_public_path에 있습니다. Sprockets :: Helpers :: RailsHelper :: AssetPaths는 ActionView :: AssetPaths를 상속 받고 여러 메소드를 오버라이드합니다. compute_public_path가 Sass :: Rails :: Resolver # public_path 메서드를 통해 호출되면 sass-rails이고, 레일 스프로킷 도우미는 자산을 해결하는 작업을 선택합니다. Sprockets :: Helpers :: RailsHelper :: AssetPaths # compute_public_path는 ActionView :: AssetPaths # compute_public_path 인 super를 나타냅니다. 이 메소드에는 has_request의 조건이 있습니까? rewrite_relative_url_root에 아래와 같이 :

def compute_public_path(source, dir, ext = nil, include_host = true, protocol = nil) 
    ... 
    source = rewrite_relative_url_root(source, relative_url_root) if has_request? 
    ... 
end 

def relative_url_root 
    config = controller.config if controller.respond_to?(:config) 
    config ||= config.action_controller if config.action_controller.present? 
    config ||= config 
    config.relative_url_root 
end 

당신은 현재와 상대 URL 루트를 해결하기 위해 컨트롤러 변수에서 파생 할 수있는 능력이 될 수있는 요청에 의존 rewrite_relative_url_root의 내부를 보면. 문제는 톱니가 이러한 자산을 해결할 때 컨트롤러가 없으므로 요청이 없기 때문입니다.

위의 해결책은 나를 위해 개발 모드에서 작동하지 않았습니다. 다음은 지금 사용하기위한 솔루션입니다.