คุณไม่ควรโหลดไฟล์ JS หรือ CSS ของคุณนอกท่อส่งทรัพย์สินเพราะคุณเสียคุณสมบัติที่สำคัญที่ทำให้ Rails ยอดเยี่ยม และคุณไม่ต้องการอัญมณีอื่น ฉันเชื่อในการใช้อัญมณีให้น้อยที่สุดและไม่จำเป็นต้องใช้อัญมณีที่นี่
สิ่งที่คุณต้องการเรียกว่า "ตัวควบคุมจาวาสคริปต์เฉพาะ" ("จาวาสคริปต์เฉพาะการกระทำรวมอยู่ที่ด้านล่าง) นี้ช่วยให้คุณสามารถโหลดไฟล์จาวาสคริปต์ที่เฉพาะเจาะจงสำหรับการควบคุมที่เฉพาะเจาะจงพยายามที่จะเชื่อมต่อจาวาสคริปต์ของคุณ ย้อนหลังและไม่เป็นไปตามรูปแบบการออกแบบ MVC คุณต้องการเชื่อมโยงกับตัวควบคุมหรือการกระทำภายในตัวควบคุมของคุณ
ขออภัยด้วยเหตุผลใดก็ตามที่ Rails devs ตัดสินใจว่าโดยค่าเริ่มต้นทุกหน้าจะโหลดไฟล์ JS ทุกไฟล์ที่อยู่ในไดเรกทอรีสินทรัพย์ของคุณ ทำไมพวกเขาตัดสินใจทำเช่นนี้แทนที่จะเปิดใช้งาน "ตัวควบคุมจาวาสคริปต์เฉพาะ" โดยค่าเริ่มต้นฉันจะไม่มีทางรู้ สิ่งนี้ทำผ่านไฟล์ application.js ซึ่งมีบรรทัดของรหัสต่อไปนี้เป็นค่าเริ่มต้น:
//= require_tree .
นี้เป็นที่รู้จักในฐานะผู้สั่ง มันเป็นสิ่งที่เฟืองใช้ในการโหลดไฟล์ JS ทุกไฟล์ในไดเรกทอรีสินทรัพย์ / javascripts โดยค่าเริ่มต้นเฟืองจะโหลด application.js และ application.css โดยอัตโนมัติและคำสั่ง require_tree จะโหลดไฟล์ JS และ Coffee ทุกไฟล์ในไดเรกทอรีที่เกี่ยวข้อง
หมายเหตุ:เมื่อคุณนั่งร้าน (หากคุณไม่ได้นั่งร้านตอนนี้เป็นเวลาที่ดีในการเริ่มต้น) Rails จะสร้างไฟล์กาแฟให้คุณโดยอัตโนมัติสำหรับตัวควบคุมนั่งร้านนั้น หากคุณต้องการให้มันสร้างไฟล์JS มาตรฐานแทนที่จะเป็นไฟล์กาแฟให้ลบgem gemที่เปิดใช้งานโดยค่าเริ่มต้นในGemfileของคุณและ scaffold ของคุณจะสร้างไฟล์ JS แทน
ตกลงดังนั้นขั้นตอนแรกในการเปิดใช้งาน "ตัวควบคุมจาวาสคริปต์ที่เฉพาะเจาะจง" คือการลบรหัส require_tree จากไฟล์ application.js ของคุณหรือเปลี่ยนเป็นโฟลเดอร์ภายในไดเรกทอรีสินทรัพย์ / javascripts ของคุณหากคุณยังต้องการไฟล์ JS ทั่วโลก 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:แทนที่ javascript_include_tag ในไฟล์ application.html.erb ของคุณด้วยสิ่งนี้ (หมายเหตุส่วน params [: controller]:
<%= javascript_include_tag 'application', params[:controller], 'data-turbolinks-track': 'reload' %>
รีสตาร์ทเซิร์ฟเวอร์และวิโอล่าของคุณ! ไฟล์ JS ที่สร้างโดยนั่งร้านของคุณจะโหลดตอนนี้เมื่อมีการเรียกตัวควบคุมนั้นเท่านั้น
ต้องการโหลดไฟล์ JS เฉพาะใน ACTION เฉพาะในคอนโทรลเลอร์ของคุณ IE / บทความ / ใหม่หรือไม่ ทำสิ่งนี้แทน:
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(*/*)
จากนั้นเพิ่มโฟลเดอร์ใหม่ที่มีชื่อเดียวกับที่คุณควบคุมในโฟลเดอร์ทรัพย์สิน / javascripts ของคุณและวางไฟล์ js ของคุณด้วยชื่อเดียวกับการกระทำของคุณ จากนั้นจะโหลดในการดำเนินการเฉพาะนั้น