2011-09-15 2 views
21

컨트롤러의 특정 JavaScript 로직을 표준 application.js에서 제외하고 해당 컨트롤러에만 포함 시키려면 자체 .js 파일에 넣고 그러한 같은 레이아웃에서 컨트롤러 이름을 기반으로 :레일즈 3.1 컨트롤러 별 JS 자산 사전 컴파일을위한 전략

잘 작동하지만 생산에 응용 프로그램을 배포 할 때
<%= javascript_include_tag "application", params[:controller] %> 

(내가 카피 스트라 노를 사용하고있을거야 미리 컴파일 작업 설정)에서 자산 파이프 라인은 컨트롤러 특정 JS 파일을 사전 컴파일하지 않습니다. 내 실제 JavaScript 파일이 application.js의 require 지시어에 의해 참조되지 않았기 때문에 이것이라고 생각합니다.

컨트롤러 고유 JS를 application.js로 다시 이동시키지 않고 명시 적으로 application.js에서 참조하지 않고 어떻게 처리해야합니까?

추가 파이프 파일을 사전 컴파일하도록 자산 파이프 라인에 알리는 방법이 있습니까? 프로덕션에서 특정 파일을 수동으로 사전 컴파일하려면 어떻게해야합니까?

config.assets.precompile += %w(achievements.js) 

을 ... 또는 그냥 나서서 변덕 모든 자바 스크립트 파일을 추가 :

업데이트

그것을 turns out, 당신은 당신의 config/environments/production.rb 여기에 개별 파일을 지정할 수 있습니다

config.assets.precompile += %w(*.js) 
+2

이것은 정말로 자동적이어야합니다! –

+3

precomile 목록에 scss/coffee 파일을 추가하면 작동하지 않습니다. (그리고 아무런 오류도 던지지 마라!). .js/css 확장자로만 이름을 지정해야합니다. –

답변

4

이것은 내가하는 일입니다.

,210

디렉토리 구조 :

app/assets/javascripts/sessions/multiple.js 
app/assets/application-sessions.js 

응용 프로그램 sessions.js은있다 : 당신의보기에서 다음

*= require_self 
*= require_tree ./sessions 

, 내 application_controller에

<% if @current_controller == 'whatever' %> 
    <%= javascript_include_tag "application-sessions" %> 
<% else %> 
    …. 
<% end %> 

참고로, @current_controller = controller_name을 .rb 메서드를 호출하여 before_filter를 호출합니다.

+0

마치 업데이트보다 조금 더 복잡하지만 솔루션처럼 보입니다. 내 솔루션에 의도하지 않은 부작용이 없기를 바랍니다. –

+0

나는 네 길은 괜찮다고 생각한다. 필자가 나열한 코드는 코드의 "영역"에 따라 원하는 js 파일 만 포함시킬 수 있습니다. 그렇게하면 필요한 것 이상을로드하지 않게됩니다. – jschorr

5

나는 당신과 james_schorr이 실제로 같은 것을 이야기하지 않는다고 생각합니다. application.js 이외의 파일을 config.assets.precompile에 추가해야합니다. 그의 대답은 당신이 받아 들일 수 있거나 받아 들여야 만하는 디렉토리 구조에 관한 것이 었습니다. 나는 특정 컨트롤러가하고 싶었다면

, 내가 할 것 :

/assets 
    /javascripts 
     /users 
      login.js 
      profile.js 
     /blogs 
     /posts 
     users.js 
     blogs.js 
     posts.js 

그리고 예를 들어

가, users.js은 다음과 같습니다

*= require_tree ./users 

, 당신이 조직을 유지할 수있는 그런 방법을 (많이의이 컨트롤러 당 js 파일). 그러나 prod에서는 모든 파일이 하나의 파일에 포함됩니다.

아직도 당신의 설정에서 그 필요 : 여기 같은 문제가 발생하고

config.assets.precompile += %w(*.js) 
0

, 그것이 나에게 두통이다.

* .js를 포함하면 모든 파일을 분리 된 파일로 컴파일하지 않고 일부 파일을 병합한다고 가정합니다.

제 생각에는 "컨트롤러"와 같은 하위 디렉토리에 컨트롤러 특정 파일을 저장하고 사전 컴파일을 위해 컨트롤러/* .js 또는 css 파일 만 포함하십시오.

작동 여부에 관계없이 어쨌든 시도해 보겠습니다. 유용한 힌트 일 수 있습니다. 당신이 JS를 미리 컴파일하려면

7

가 | CSS를 만 자산/자바 스크립트 및 자산/스타일 디렉토리의 루트에있는 (그리고 자신의 트리 계층), 당신은 환경 파일이 넣을 수 있습니다 :

Dir.chdir "#{Rails.root}/app/assets/javascripts" 
    a = Dir.glob("*.{js,coffee,erb}") 
    Dir.chdir "#{Rails.root}/app/assets/stylesheets" 
    b = Dir.glob("*.{css,erb}") 
    config.assets.precompile += a.concat(b) 
    Dir.chdir Rails.root 
관련 문제