특정 CSS를 조건부로 사용하기 위해 Rails 3.1 자산 파이프 라인 사용


166

Rails 3.1.rc5를 사용하여 첫 번째 Solo Rails 앱을 구축하는 중입니다. 내 문제는 내 사이트가 다양한 CSS 파일을 조건부로 렌더링하도록하고 싶다는 것입니다. Blueprint CSS를 사용하고 있으며 인쇄 할 때와 Internet Explorer에서 사이트에 액세스 할 때만 스프로킷 / 레일을 screen.css대부분 렌더링하려고합니다 .print.cssie.css

불행하게도, 매니페스트 의 기본 *= require_tree명령 application.cssassets/stylesheets디렉토리의 모든 것을 포함 하고 불쾌한 CSS 혼란을 초래합니다. 현재 해결 방법은 모든 것을 개별적으로 지정하는 일종의 무차별 방법입니다.

application.css에서 :

*= require_self
*= require home.css
...
*= require blueprint/screen.css

내 스타일 시트에서 부분 (haml) :

<!--[if lt IE 9]
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
![endif]-->
= stylesheet_link_tag "application"
= stylesheet_link_tag 'blueprint/print', media: 'print'
<!--[if lt IE8]]
= stylesheet_link_tag 'blueprint/ie'
![endif]-->
= javascript_include_tag "application"

이것은 작동하지만 특히 예쁘지는 않습니다. 나는 심지어 이것을 얻기 위해 몇 시간 동안 검색을 해 왔지만 방금 놓친 더 쉬운 방법이 있기를 바라고 있습니다. 하위 디렉토리를 포함하지 않고 특정 디렉토리를 선택적으로 렌더링 할 수 있다면 전체 프로세스가 훨씬 덜 엄격 해집니다.

감사!

답변:


223

자산 파이프 라인을 사용하면서 스타일 시트를 그룹화하여 덜 견고하고 미래의 증거를 만드는 방법을 발견했습니다. 솔루션보다 훨씬 간단하지는 않지만이 솔루션을 사용하면 전체 구조를 다시 편집하지 않고도 새 스타일 시트를 자동으로 추가 할 수 있습니다.

원하는 것은 별도의 매니페스트 파일을 사용하여 문제를 해결하는 것입니다. 먼저 app/assets/stylesheets폴더 를 다시 구성해야 합니다.

app/assets/stylesheets
+-- all
    +-- your_base_stylesheet.css
+-- print
    +-- blueprint
        +-- print.css
    +-- your_print_stylesheet.css
+-- ie
    +-- blueprint
        + ie.css
    +-- your_ie_hacks.css
+-- application-all.css
+-- application-print.css
+-- application-ie.css

그런 다음 세 개의 매니페스트 파일을 편집합니다.

/**
 * application-all.css
 *
 *= require_self
 *= require_tree ./all
 */

/**
 * application-print.css
 *
 *= require_self
 *= require_tree ./print
 */

/**
 * application-ie.css
 *
 *= require_self
 *= require_tree ./ie
 */

다음으로 애플리케이션 레이아웃 파일을 업데이트하십시오.

<%= stylesheet_link_tag "application-all", :media => "all" %>
<%= stylesheet_link_tag "application-print", :media => "print" %>

<!--[if lte IE 8]>
    <%= stylesheet_link_tag "application-ie", :media => "all" %>
<![endif]-->

마지막으로,이 새로운 매니페스트 파일을 config / environments / production.rb에 포함시키는 것을 잊지 마십시오 :

config.assets.precompile += %w( application-all.css application-print.css application-ie.css )

최신 정보:

Max가 지적 했듯이이 구조를 따르면 이미지 참조를 염두에 두어야합니다. 몇 가지 선택 사항이 있습니다.

  1. 동일한 패턴을 따르도록 이미지 이동
    • 이미지가 모두 공유되지 않은 경우에만 작동합니다.
    • 나는 이것이 너무 복잡하기 때문에 이것이 초보자가 아닌 것으로 기대합니다.
  2. 이미지 경로를 규정하십시오.
    • background: url('/assets/image.png');
  3. SASS 도우미를 사용하십시오.
    • background: image-url('image.png');

1
이것은 파일의 훌륭한 구성이지만 질문 자체와 동일한 방식으로 여전히 핵심 문제를 해결한다고 생각합니다.
semperos

@ semperos, 솔루션의 모양이 본질적으로 동일하지만 내 제안에 따라 스타일 시트 전체에 자산 파이프 라인을 사용할 수 있습니다. 별도의 스타일 시트에 있지 않으면 스타일의 일부를 선택적으로 포함시키는 다른 방법이 있는지 확실하지 않습니다. 적어도 이런 식으로 우리는 소수의 CSS 파일로 컴파일합니다.
gcastro

5
Rails Asset Pipeline 안내서에서 이와 같은 것이 실제로 좋습니다. 고마워
Bashar Abdullah

3
이 구조를 따르고 간단한 .css파일을 사용 하면 모든 이미지가 손상됩니다. 예 background: url('image.png')를 들어 경로로 변환됩니다 (경로 /assets/all/image.png모두 표시 ). 대신 이것은 작동합니다 : background: url('/assets/image.png). 더 쉬운 해결책이 있으면 게시하십시오. 경로를 올바르게 해결하는 도우미 방법이있는 SASS를 사용하는 것 외에.
Max

1
@ExiRe입니다. 표준 패턴을 따르지 않는 모든 스타일 시트 나 JS 파일 / 매니페스트는 사전 컴파일 배열에 추가해야합니다 ( guides.rubyonrails.org/asset_pipeline.html#precompiling-assets 참조 )
gcastro

10

오늘이 문제를 겪었습니다.

모든 IE 특정 스타일 시트를 lib / assets / stylesheets에 넣고 IE 버전 당 하나의 매니페스트 파일을 만들었습니다. 그런 다음 application.rb에서 사전 컴파일 할 항목 목록에 추가하십시오.

config.assets.precompile += ["ie9.css", "ie7.css", "ie8.css", "ie.css"]

그리고 레이아웃에 조건부로 매니페스트 파일을 포함하면 좋습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.