Rails를 훌륭하게 만드는 중요한 기능을 잃어 버리기 때문에 자산 파이프 라인 외부에서 JS 또는 CSS 파일을로드해서는 안됩니다. 그리고 당신은 다른 보석이 필요하지 않습니다. 나는 가능한 한 적은 보석을 사용한다고 생각하며 여기서 보석을 사용할 필요는 없습니다.
원하는 것은 "컨트롤러 특정 Javascript"( "활동 특정 Javascript가 맨 아래에 포함되어 있습니다.)입니다.이를 통해 특정 컨트롤러에 대한 특정 JavaScript 파일을로드 할 수 있습니다. Javascript를보기에 연결하려고하는 것은 일종의 .. 뒤로하고 MVC 디자인 패턴을 따르지 않는 경우 컨트롤러와 컨트롤러 또는 컨트롤러 내부의 작업과 연결하려고합니다.
불행하게도, 어떤 이유로 든 Rails devs는 기본적으로 모든 페이지가 자산 디렉토리에있는 모든 JS 파일을로드 할 것이라고 결정했습니다. 기본적으로 "Controller Specific Javascript"를 활성화하는 대신이 작업을 수행하기로 결정한 이유는 알 수 없습니다. 이 작업은 application.js 파일을 통해 수행되며 기본적으로 다음 코드 줄이 포함됩니다.
//= require_tree .
이것을 지시문이라고 합니다. 이것이 스프라켓이 자산 / javascripts 디렉토리의 모든 JS 파일을로드하기 위해 사용하는 것입니다. 기본적으로 스프로킷은 application.js 및 application.css를 자동으로로드하며 require_tree 지시문은 모든 JS 및 Coffee 파일을 해당 디렉토리에로드합니다.
참고 : 비계를 사용하는 경우 (비계가 아닌 경우 이제 시작하기에 좋은시기입니다) Rails 는 해당 비계의 컨트롤러에 대해 자동으로 커피 파일을 생성합니다 . 커피 파일 대신 표준 JS 파일 을 생성 하려면 Gemfile 에서 기본적으로 활성화 된 커피 보석 을 제거하면 스캐 폴드가 대신 JS 파일을 생성합니다.
"Controller Specific Javascript"를 활성화 하는 첫 번째 단계 는 application.js 파일에서 require_tree 코드를 제거하거나 여전히 전역 JS 파일이 필요한 경우 asset / javascripts 디렉토리 내의 폴더로 변경하는 것입니다. IE :
//= require_tree ./global
2 단계 : config / initializers / assets.rb 파일로 이동하여 다음을 추가하십시오.
%w( controllerone controllertwo controllerthree ).each do |controller|
Rails.application.config.assets.precompile += ["#{controller}.js", "#{controller}.css"]
end
원하는 컨트롤러 이름을 삽입하십시오.
3 단계 : application.html.erb 파일에서 javascript_include_tag를 다음과 같이 바꿉니다 (params [: controller] 부분 참고 :
<%= javascript_include_tag 'application', params[:controller], 'data-turbolinks-track': 'reload' %>
서버와 비올라를 다시 시작하십시오! 스캐 폴드로 생성 된 JS 파일은 이제 해당 컨트롤러가 호출 될 때만로드됩니다.
컨트롤러의 특정 ACTION에 특정 JS 파일을로드해야 합니까? IE / articles / new ? 대신이 작업을 수행하십시오.
application.html.erb :
<%= javascript_include_tag "#{controller_name}/#{action_name}" if AppName::Application.assets.find_asset("#{controller_name}/#{action_name}") %>
config / initializers / assets.rb :
config.assets.precompile += %w(*/*)
그런 다음 자산 / 자바 스크립트 폴더에서 컨트롤러와 동일한 이름의 새 폴더를 추가하고 내부에 작업과 동일한 이름의 js 파일을 넣으십시오. 그런 다음 해당 특정 작업에로드합니다.