ProgramingTip

Rails 3.1 자산 파이프 라인 : 컨트롤러 별 펼쳐지는 방법은 무엇입니까?

bestdevel 2020. 10. 15. 08:08
반응형

Rails 3.1 자산 파이프 라인 : 컨트롤러 별 펼쳐지는 방법은 무엇입니까?


Rails 3.1에서 새 컨트롤러를 생성하면 컨트롤러 이름이 포함되어 있습니다. 첫째,이 자바 펼쳐 파일은 관련 컨트롤러가 호출 될 때만 사용된다고 생각했습니다.

기본적으로 명령이 //= require_tree .에서 application.js그것의 나무에 모든 자바 펼쳐 파일을 포함-파일은.

컨트롤러 특정 시나리오 만로드 지불해야합니까?


필요한 name_of_the_js_file.js 파일 만로드 후 다음을 수행하십시오.

  1. 를 제거 //=require_tree에서application.js

  2. 자산 파이프 라인에 js 파일 (특정 페이지가로드 될 때로 드하려는 파일) 유지

  3. 도우미 추가 application_helper.rb

    def javascript(*files)
      content_for(:head) { javascriptinclude_tag(*files) }
    end
    
  4. 레이아웃에 양보하십시오.

    <%= yield(:head) %>
    
  5. 보기 파일에 다음을 추가하십시오.

    <% javascript 'name_of_the_js_file' %>
    

그럼 괜찮을거야


이에 대한 우아한 해결책은 javascriptinclude_tag에 controller_name을 요구하는 것입니다.

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

<%= javascriptinclude_tag "application", controller_name %>

controller_name.js 가로 드되고 자산에도 있으므로 여기에서 다른 파일을 요구할 수 있습니다.

예를 들어 cars # index를 사용하면

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

cars.js가 포함 할 수있는 위치

//= require wheel
//= require tyre

즐겨!


나는 항상 수정 된 수정 사항 파일에 수정되었습니다. js를 작업으로 범위 내에서 처리 할 수 ​​있습니다.

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

문제는 다양한 방법으로 사용할 수 있습니다.

자산을 동적으로 추가

수준이 높은 수준의 장비 수준이 있습니다.

  1. 애플리케이션 도우미에 다음 메소드를 추가합니다.

    module ApplicationHelper
        def include_related_asset(asset)
        #          v-----{Change this}
            if !YourApp::Application.assets.find_asset(asset).nil?
                case asset.split('.')[-1]
                    when 'js'
                        javascriptinclude_tag asset
                    when 'css'
                        stylesheet_link_tag asset
                end
            end
        end
    end
    
  2. layout-file 에서 도우미 메서드를 호출합니다 .

    <%= include_related_asset(params[:controller].to_param + '_' + params[:action].to_param . 'js') %>
    
  3. 컨트롤러 작업에 대한 특정 자산을 만듭니다. 예.controller_action.js

YourApp앱 이름 을 변경 하는 것을 잊지 마세요 .

사용하다 yield

  1. <%= yield :head%>레이아웃 헤드에 추가
  2. 작업보기에서 자산 포함 :

    <% content_for :head do %>
    <%= javascriptinclude_tag 'controller_action' %>
    <% end %>
    

자세한 내용은 Rails 가이드참조하세요 .


나는 albandiguer의 솔루션을 좋아 합니다 . 나는 자바 펼쳐 / 펼쳐져 자산이 식별 적으로 사전에 발견되지 않았습니다. 사용하려는 모든 종류의 오류가 발생합니다 javascriptpath. 그의 의견에 의견에있는 몇 사람의 문제를 해결 한 후이 문제에 대한 해결책을 공유하겠습니다. 주로 JavaScript 파일이라는 컨트롤러의 일부만 처리합니다.

그래서 .coffee / .js 관계에 관계없이 파일이 javascript 디렉토리에 있는지 감지하는 응용 프로그램 도우미를 만들었습니다.

module ApplicationHelper
  def javascriptasset_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

이 메소드는 javascript 파일이있는 경우 전체 경로를 반환합니다. 개체는 nil을 반환합니다. 따라서 Pencilcheck의 설명에 따라이 방법을 조건부 포함에 추가 할 수 있습니다.

<%= javascriptinclude_tag(controller_name) if javascriptasset_path(controller_name) %>

이제 적절한 조건부 포함이 있습니다. 이제 미리 컴파일 된 자산 문제입니다. 일반적으로 최적화 를 위해 애셋을 개별적으로 미리 컴파일하는 것을 원하지 않습니다 . 그러나 다음과 같은 경우에 할 수 있습니다.

# Live Compilation
config.assets.compile = true

이를 환경 구성 파일에 추가 할 수 있습니다. 먼저 개발 환경 파일에서 테스트하십시오. 다시 말하지만 이것은 바람직하지 않습니다. Rails 자산 파이프 라인은 스프로킷을 사용하여 모든 것을 최적화합니다.

Sprockets는 지정된 파일을로드하고 필요한 경우 처리 한 다음 단일 파일로 연결 한 다음 압축합니다 (Rails.application.config.assets.compress가 true 인 경우). 여러 파일이 아닌 하나의 파일을 제공하면 브라우저가 더 적은 요청을 생성하므로 페이지로드 시간을 크게 줄일 수 있습니다. 압축은 또한 파일 크기를 줄여 브라우저가 파일을 더 빠르게 다운로드 할 수 있도록합니다.

스프로킷 (자산 파이프 라인) http://guides.rubyonrails.org/asset_pipeline.html 의 메커니즘에 대한 자세한 내용은 문서를 읽으 십시오.

자산은 개별적으로 사전 컴파일되지 않습니다. 예를 들어 내가 시도 할 때 :

<%= javascriptinclude_tag 'event' %>

나는 얻다:

톱니 :: 레일 :: 도우미 :: AssetFilteredError : 자산을 여과 제공되지 않습니다 : 추가 Rails.application.config.assets.precompile += %w( event.js )config/initializers/assets.rb하고 서버를 다시 시작

따라서 개별적으로 사전 컴파일 할 자산을 포함 할 수 있습니다. 자산 이니셜 라이저에 javascript 파일이라는 관련 컨트롤러를 추가하기 만하면됩니다. 우리는 이것을 프로그래밍 방식으로 할 수 있습니다.

컨트롤러 이름 목록을 얻으려면 ecoologic의 예를 사용합니다 .

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

이제 컨트롤러 이름의 기본 이름과 일치하는 모든 javascript 파일의 이름을 얻으려면 다음을 사용할 수 있습니다.

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

그러면 컨트롤러 이름과 일치하는 디렉토리 경로없이 모든 javascript 파일 목록이 표시됩니다. 컨트롤러 이름이 복수 인 경우 자바 스크립트 이름도 같아야합니다. 또한 컨트롤러가 단수이고 javascript 파일이 복수 인 the_file[a_controller]경우 부분 일치에서 성공 하므로 여전히 포함됩니다 .

Rails.application.config.assets.precompile설정 에서 자유롭게 시도해보십시오 . 나는 이것이 당신에게 파일 목록을 올바르게 얻는다는 것을 알고 있습니다. 그러나 나는 당신이 그것을 테스트하도록 남겨 둘 것입니다. 이 방법으로 미리 컴파일하는 것과 관련된 뉘앙스가 있으면 알려주세요.

자산 사전 컴파일 방법에 대한 자세한 설명은 다음 블로그를 참조하십시오. http://www.sitepoint.com/asset-precompile-works-part/


최근에 특정 컨트롤러에 대해 생성 된 스크립트를 사용하는 간단한 방법을 찾았습니다. 나는 그 솔루션 gem gon을 사용 합니다. 컨트롤러 추가 :

class HomesController < ApplicationController
  before_filter :remember_controller

  private

  def remember_controller
    gon.controller = params[:controller]
  end
end

그 후 파일을 열고 homes.js.cofee파일 시작 부분에 추가하십시오.

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

그게 다입니다.

참고 URL : https://stackoverflow.com/questions/6571753/rails-3-1-asset-pipeline-how-to-load-controller-specific-scripts

반응형