เหตุใดฉันจึงสามารถเข้าถึงวิธีการช่วยเหลือสำหรับคอนโทรลเลอร์หนึ่งตัวในมุมมองสำหรับคอนโทรลเลอร์อื่นได้ มีวิธีปิดการใช้งานโดยไม่ต้องแฮ็ก / แพทช์ Rails หรือไม่?
เหตุใดฉันจึงสามารถเข้าถึงวิธีการช่วยเหลือสำหรับคอนโทรลเลอร์หนึ่งตัวในมุมมองสำหรับคอนโทรลเลอร์อื่นได้ มีวิธีปิดการใช้งานโดยไม่ต้องแฮ็ก / แพทช์ Rails หรือไม่?
คำตอบ:
วิธีการของ @ George Schreiber ไม่ได้ผลเหมือน Rails 3.1; รหัสมีการเปลี่ยนแปลงอย่างมีนัยสำคัญ
อย่างไรก็ตามตอนนี้มีวิธีที่ดีกว่าในการปิดใช้งานคุณลักษณะนี้ใน Rails 3.1 (และหวังว่าจะเป็นในภายหลัง) ใน config / application.rb ของคุณเพิ่มบรรทัดนี้:
config.action_controller.include_all_helpers = false
วิธีนี้จะป้องกันไม่ให้ ApplicationController โหลดตัวช่วยทั้งหมด
(สำหรับใครก็ตามที่สนใจนี่คือคำขอดึงที่สร้างคุณลักษณะนี้ )
คำตอบขึ้นอยู่กับรุ่น Rails
เปลี่ยนการกำหนดค่าinclude_all_helpers
เป็นfalse
ในสภาพแวดล้อมใด ๆ ที่คุณต้องการใช้การกำหนดค่า application.rb
หากคุณต้องการตั้งค่าที่จะนำไปใช้กับทุกสภาพแวดล้อมเปลี่ยนได้ใน
config.action_controller.include_all_helpers = false
ลบบรรทัดต่อไปนี้จาก ApplicationController
helper :all
ด้วยวิธีนี้คอนโทรลเลอร์แต่ละตัวจะโหลดตัวช่วยของตัวเอง
include HelperName
ที่ด้านบนของ ApplicationHelper ของคุณได้
ใน Rails 3 actioncontroller/base.rb
(รอบบรรทัด 224):
def self.inherited(klass)
super
klass.helper :all if klass.superclass == ActionController::Base
end
ใช่ถ้าคุณได้มาจากชั้นเรียนของคุณActionController::Base
ผู้ช่วยทั้งหมดจะรวมอยู่ด้วย
ในการแก้ไขปัญหานี้ให้เรียกclear_helpers
( AbstractClass::Helpers
รวมอยู่ในActionController::Base
) ที่จุดเริ่มต้นของรหัสคอนโทรลเลอร์ของคุณ ความคิดเห็นซอร์สโค้ดสำหรับ clear_helpers:
# Clears up all existing helpers in this class, only keeping the helper
# with the same name as this class.
เช่น:
class ApplicationController < ActionController::Base
clear_helpers
...
end
clear_helpers
ความเสียหาย (ประสิทธิภาพ) นั้นได้เกิดขึ้นแล้วเนื่องจากตัวช่วยทั้งหมดถูกโหลด คุณต้องการใช้จริงๆconfig.action_controller.include_all_helpers = false
(ตามที่ @Craig Walker กล่าวไว้ด้านบน) เนื่องจากจะป้องกันไม่ให้ผู้ช่วยโหลดตั้งแต่แรกจึงได้รับประสิทธิภาพบางอย่าง (อาจสำคัญที่สุดในโหมดการพัฒนา) ขอบคุณที่รวมactioncontroller/base.rb
ข้อมูลโค้ด เป็นเรื่องดีเสมอที่ได้เห็นโค้ดและลบปริศนาบางอย่าง
clear_helpers
ยังคงมีประโยชน์สำหรับราง 3.0 - config.action_controller.include_all_helpers = false
เป็นเฉพาะราง 3.1 ขึ้นไป
จริงๆแล้วในRails 2ฟังก์ชันเริ่มต้นของ ActionController :: Base คือการรวมตัวช่วยทั้งหมด
การเปลี่ยนแปลง 6222 เมื่อ 02/24/07 20:33:47 (3 ปีที่แล้ว) โดย dhh : ตั้งสมมติฐานเริ่มต้นว่าคุณต้องการผู้ช่วยทั้งหมดตลอดเวลา (ใช่ใช่)
เปลี่ยนแปลง:
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
end
สำหรับ Rails 3 beta 1 นั้นไม่เป็นเช่นนั้นอีกต่อไปตามที่ระบุไว้ใน CHANGELOG: