복붙노트

[RUBY-ON-RAILS] 3.1 자산 파이프 라인을 레일 : 어떻게 부하 컨트롤러 고유의 스크립트에?

RUBY-ON-RAILS

3.1 자산 파이프 라인을 레일 : 어떻게 부하 컨트롤러 고유의 스크립트에?

나는 레일 3.1의 새로운 컨트롤러, 또한 컨트롤러의 이름의 자바 스크립트 파일이 자동으로 추가됩니다 발생하는 경우. 첫째, 나는 관련 컨트롤러를 호출 할 때이 자바 스크립트 파일 만 사용됩니다 생각했다.

기본적으로 명령 // = require_tree있다. application.js 파일에, 그것의 트리에있는 모든 자바 스크립트 파일을 포함하는.

어떻게에만 컨트롤러 특정 스크립트를로드 할 수 있을까?

해결법

  1. ==============================

    1.단지 필요한 name_of_the_js_file.js 파일을로드하려면 :

    단지 필요한 name_of_the_js_file.js 파일을로드하려면 :

    그런 다음 확인을해야

  2. ==============================

    2.이것에 대한 우아한 솔루션은 javascript_include_tag에 controller_name을 필요로하는 것입니다

    이것에 대한 우아한 솔루션은 javascript_include_tag에 controller_name을 필요로하는 것입니다

    http://apidock.com/rails/ActionController/Metal/controller_name/class 참조

    <%= javascript_include_tag "application", controller_name %>
    

    controller_name.js로드 또한 자산에, 그래서 당신은 여기에서 다른 파일을 필요로 할 것입니다.

    예를 들어, 자동차 # 인덱스를 렌더링 줄 것이다

    <%= javascript_include_tag "application", "cars" %>
    

    cars.js가 포함 할 수있는

    //= require wheel
    //= require tyre
    

    즐겨 !

  3. ==============================

    3.난 항상 내 레이아웃 파일 안에이 포함되어 있습니다. 그것은 범위 조치로 JS를 할 수

    난 항상 내 레이아웃 파일 안에이 포함되어 있습니다. 그것은 범위 조치로 JS를 할 수

    <%= javascript_include_tag params[:controller] if AppName::Application.assets.find_asset("#{params[:controller]}.js") %>
    <%= javascript_include_tag "#{params[:controller]}_#{params[:action]}"  if AppName::Application.assets.find_asset("#{params[:controller]}_#{params[:action]}.js") %>
    
  4. ==============================

    4.귀하의 문제는 다른 방법으로 해결할 수 있습니다.

    귀하의 문제는 다른 방법으로 해결할 수 있습니다.

    컨트롤러의 특성은 미리 컴파일되지 않기 때문에이 생산 모드에 대한 좋은 해결책이 아니라는 것을 고려하시기 바랍니다!

    앱 이름으로 YourApp을 변경하는 것을 잊지 마십시오.

    자세한 내용은 레일 가이드를 참조하십시오.

  5. ==============================

    5.나는 albandiguer의 솔루션을 좋아한다. 있는 나는 자바 스크립트 / 커피 스크립트 자산은 개별적으로 미리 컴파일되지 않은 것으로 나타났습니다. 어떤 javascript_path를 사용하려고 시도하는 오류가 모든 종류의가 발생합니다. 나는이 문제가 그의 의견에 언급 된 몇 사람을 해결 한 후 그 문제에 대한 내 솔루션을 공유 할 수 있습니다. 주로 컨트롤러라는 이름의 자바 스크립트 파일의 부분 집합을 처리.

    나는 albandiguer의 솔루션을 좋아한다. 있는 나는 자바 스크립트 / 커피 스크립트 자산은 개별적으로 미리 컴파일되지 않은 것으로 나타났습니다. 어떤 javascript_path를 사용하려고 시도하는 오류가 모든 종류의가 발생합니다. 나는이 문제가 그의 의견에 언급 된 몇 사람을 해결 한 후 그 문제에 대한 내 솔루션을 공유 할 수 있습니다. 주로 컨트롤러라는 이름의 자바 스크립트 파일의 부분 집합을 처리.

    나는 파일이 .coffee에 관계없이 자바 스크립트 디렉토리에 존재하는 경우 감지 할 수있는 응용 프로그램 도우미를 내장 그래서 / 확장 된 .js :

    module ApplicationHelper
      def javascript_asset_path(basename)
        Sprockets::Rails::Helper.assets.paths.select{|i|
          i =~ /javascript/ and i =~ /#{Rails.root}/
        }.each do |directory|
          if Dir.entries(directory).map {|i| i.split('.')[0]}.compact.
              include? basename
            return File.join(directory, basename)
          end
        end
        nil
      end
    end
    

    존재하는 경우이 방법은 자바 스크립트 파일의 전체 경로를 반환합니다. 그렇지 않으면 nil을 반환합니다. 당신이 조건이 방법을 추가 할 수 있습니다 Pencilcheck의 의견을 다음 그래서 다음과 같습니다 :

    <%= javascript_include_tag(controller_name) if javascript_asset_path(controller_name) %>
    

    그리고 지금 당신은 적절한 조건이 포함되어 있습니다. 이제 미리 컴파일 된 자산의 문제에 대한. 일반적으로 최적화를 위해 당신은 자산을 개별적으로 미리 컴파일하지 않습니다. 당신이해야 할 경우 당신은 그러나 그것을 할 수 있습니다 :

    # Live Compilation
    config.assets.compile = true
    

    이 사용자 환경 설정 파일을 추가 할 수 있습니다. 먼저 개발 환경 파일을 테스트합니다. 다시이 잘못 것이 좋습니다. 레일 자산 파이프 라인 최적화 모든 것에 톱니를 사용합니다 :

    별표 (자산 파이프 라인)의 역학의 자세한 내용은 문서 http://guides.rubyonrails.org/asset_pipeline.html를 읽어 보시기 바랍니다

    자산은 개별적으로 미리 컴파일되지 않습니다. 예를 들어 내가하려고 할 때 :

    <%= javascript_include_tag 'event' %>
    

    나는 얻다:

    그래서 당신은 개별적으로 미리 컴파일 할 수있는 자산을 포함 할 수 있습니다. 우리는 우리의 자산 초기화에 관련 컨트롤러라는 이름의 자바 스크립트 파일을 추가해야합니다. 그런데 우리는 프로그래밍 방식으로이 작업을 수행 할 수 있습니다.

    내가 ecoologic의 예를 사용하는 컨트롤러 이름의 목록을 얻으려면 :

    all_controllers =  Dir[
        Rails.root.join('app/controllers/*_controller.rb')
      ].map { |path|
        path.match(/(\w+)_controller.rb/); $1
      }.compact
    

    이제 다음을 사용할 수있는 컨트롤러 이름의 기본 이름과 일치하는 모든 자바 스크립트 파일의 이름을 얻을 수 있습니다 :

    javascripts_of_controllers = Sprockets::Rails::Helper.assets.paths.select{|a_path|
        a_path =~ /javascript/ and a_path =~ /#{Rails.root}/
      }.map {|a_path|
        Dir.entries(a_path)
      }.flatten.delete_if {|the_file|
        !the_file['.js']
      }.collect {|the_file|
        the_file if all_controllers.any? {|a_controller| the_file[a_controller]}
      }
    

    그럼 당신은 시도 할 수 있습니다 :

    # config/initializers/assets.rb
    Rails.application.config.assets.precompile += javascripts_of_controllers
    

    이렇게하면 컨트롤러 이름과 일치 디렉토리 경로없이 모든 자바 스크립트 파일의 목록을 얻을 것이다. 컨트롤러 이름이 복수 인 경우 참고, 자바 스크립트 이름도해야한다. 컨트롤러가 단수와 자바 스크립트 파일이 the_file의 [a_controller]는 부분 일치에 성공 때문에 여전히 포함됩니다 복수 인 경우도 있습니다.

    당신의 Rails.application.config.assets.precompile 설정이 밖으로 시도하시기 바랍니다. 나는이 정확하게 당신에게 파일의 목록을 가져옵니다 것을 알고있다. 그러나 나는 그것을 테스트 당신을 떠날 것이다. 나는 호기심으로이 방법을 사전 컴파일과 관련된 어떤 뉘앙스가 있는지 알려주세요.

    http://www.sitepoint.com/asset-precompile-works-part/ : 어떻게 자산에 대한 매우 철저한 설명은 사전 컴파일이 블로그를 참조

  6. ==============================

    6.나는 최근에 특정 컨트롤러에 대한 생성 된 스크립트를 사용하는 간단한 방법을 발견했다. 나는 곤 해당 솔루션 보석을 위해 사용합니다. 컨트롤러에 추가

    나는 최근에 특정 컨트롤러에 대한 생성 된 스크립트를 사용하는 간단한 방법을 발견했다. 나는 곤 해당 솔루션 보석을 위해 사용합니다. 컨트롤러에 추가

    class HomesController < ApplicationController
      before_filter :remember_controller
    
      private
    
      def remember_controller
        gon.controller = params[:controller]
      end
    end
    

    그 열어 homes.is.coffee 후 파일의 시작 부분에 추가 :

    jQuery ->
      if gon.controller == "sermons"
        # Place all functions here...
    

    그게 전부입니다.

  7. from https://stackoverflow.com/questions/6571753/rails-3-1-asset-pipeline-how-to-load-controller-specific-scripts by cc-by-sa and MIT license