Rails 3.1 자산 파이프 라인 : 컨트롤러 별 펼쳐지는 방법은 무엇입니까?
Rails 3.1에서 새 컨트롤러를 생성하면 컨트롤러 이름이 포함되어 있습니다. 첫째,이 자바 펼쳐 파일은 관련 컨트롤러가 호출 될 때만 사용된다고 생각했습니다.
기본적으로 명령이 //= require_tree .
에서 application.js
그것의 나무에 모든 자바 펼쳐 파일을 포함-파일은.
컨트롤러 특정 시나리오 만로드 지불해야합니까?
필요한 name_of_the_js_file.js 파일 만로드 후 다음을 수행하십시오.
를 제거
//=require_tree
에서application.js
자산 파이프 라인에 js 파일 (특정 페이지가로드 될 때로 드하려는 파일) 유지
도우미 추가
application_helper.rb
def javascript(*files) content_for(:head) { javascriptinclude_tag(*files) } end
레이아웃에 양보하십시오.
<%= yield(:head) %>
보기 파일에 다음을 추가하십시오.
<% 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") %>
문제는 다양한 방법으로 사용할 수 있습니다.
자산을 동적으로 추가
수준이 높은 수준의 장비 수준이 있습니다.
애플리케이션 도우미에 다음 메소드를 추가합니다.
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
layout
-file 에서 도우미 메서드를 호출합니다 .<%= include_related_asset(params[:controller].to_param + '_' + params[:action].to_param . 'js') %>
컨트롤러 작업에 대한 특정 자산을 만듭니다. 예.
controller_action.js
YourApp
앱 이름 을 변경 하는 것을 잊지 마세요 .
사용하다 yield
<%= yield :head%>
레이아웃 헤드에 추가작업보기에서 자산 포함 :
<% 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...
그게 다입니다.
'ProgramingTip' 카테고리의 다른 글
Objective-C의 속성에 블록을 저장하는 방법은 무엇입니까? (0) | 2020.10.15 |
---|---|
File.Move 작동하지 않음-파일이 이미 있음 (0) | 2020.10.15 |
Vim / Vi에 커서를 끝으로 이동하는 명령이 검색 하이라이트? (0) | 2020.10.15 |
chart.js는 완전히 새로운 데이터를로드합니다. (0) | 2020.10.15 |
Android SQLite 데이터베이스에 새 열을 추가하는 방법은 무엇입니까? (0) | 2020.10.15 |