เหตุใดผู้ช่วย Rails ทั้งหมดจึงสามารถใช้ได้กับทุกมุมมองตลอดเวลา มีวิธีปิดการใช้งานนี้หรือไม่?


89

เหตุใดฉันจึงสามารถเข้าถึงวิธีการช่วยเหลือสำหรับคอนโทรลเลอร์หนึ่งตัวในมุมมองสำหรับคอนโทรลเลอร์อื่นได้ มีวิธีปิดการใช้งานโดยไม่ต้องแฮ็ก / แพทช์ Rails หรือไม่?


3
มีคำตอบใหม่ที่ตรงประเด็นกว่า ตรวจสอบคำตอบของ Craig Walkers
ศ. 33

คำตอบ:


106

วิธีการของ @ George Schreiber ไม่ได้ผลเหมือน Rails 3.1; รหัสมีการเปลี่ยนแปลงอย่างมีนัยสำคัญ

อย่างไรก็ตามตอนนี้มีวิธีที่ดีกว่าในการปิดใช้งานคุณลักษณะนี้ใน Rails 3.1 (และหวังว่าจะเป็นในภายหลัง) ใน config / application.rb ของคุณเพิ่มบรรทัดนี้:

config.action_controller.include_all_helpers = false

วิธีนี้จะป้องกันไม่ให้ ApplicationController โหลดตัวช่วยทั้งหมด

(สำหรับใครก็ตามที่สนใจนี่คือคำขอดึงที่สร้างคุณลักษณะนี้ )


ฉันอยู่บน 3.2 application.config ในที่นี้หมายถึง config / application.rb หรือไม่
Brandon Henry

ApplicationHelper จะรวมอยู่ด้วยหรือไม่ถ้าฉันปิดใช้งาน include_all_helpers หรือฉันต้องการรวมด้วยตนเอง
Robert Audi

@AzizLight ฉันไม่แน่ใจเพราะฉันยังไม่ได้ทดสอบ อย่างไรก็ตามฉันคาดว่าจะเป็นเช่นนั้นเนื่องจาก ApplicationHelper มีจุดมุ่งหมายเพื่อให้พร้อมใช้งานในมุมมองในฐานะผู้ช่วย "root" เสมอ เป็นตัวช่วยจากคอนโทรลเลอร์ที่ไม่เกี่ยวข้องซึ่งเป็นปัญหาหลักที่นี่
Craig Walker

3
ฉันคิดว่านี่ควรเป็นพฤติกรรมเริ่มต้น
Nafaa Boutefer

98

คำตอบขึ้นอยู่กับรุ่น Rails

ราง> = 3.1

เปลี่ยนการกำหนดค่าinclude_all_helpersเป็นfalseในสภาพแวดล้อมใด ๆ ที่คุณต้องการใช้การกำหนดค่า application.rbหากคุณต้องการตั้งค่าที่จะนำไปใช้กับทุกสภาพแวดล้อมเปลี่ยนได้ใน

config.action_controller.include_all_helpers = false

เมื่อผิดพลาดก็จะข้ามรวม

ราง <3.1

ลบบรรทัดต่อไปนี้จาก ApplicationController

helper :all

ด้วยวิธีนี้คอนโทรลเลอร์แต่ละตัวจะโหลดตัวช่วยของตัวเอง


2
ไม่มีบรรทัดนี้สำหรับฉันใน Rails 3.2 ดังนั้นวิธีนี้จึงไม่น่าจะใช้กับ Rails เวอร์ชันที่ใหม่กว่าอีกต่อไป
Tyler Collier

ฉันสนใจว่าทำไมสิ่งนี้จึงเปลี่ยนไปอย่างมากจาก Rails up เวอร์ชัน 3.1? ไม่สมเหตุสมผลกับฉันมากนัก
Joshua Muheim

6
หมายเหตุ: ความคิดเห็นข้างต้นใช้ไม่ได้อีกต่อไปตอนนี้คำตอบได้รับการอัปเดตเพื่อรวม Rails> 3.1
Kyle Heironimus

3
หมายเหตุ: ApplicationHelper ของคุณจะยังโหลดอยู่ หากคุณต้องการรวมผู้ช่วยเหลือเฉพาะไว้ตลอดเวลาคุณสามารถเพิ่มinclude HelperNameที่ด้านบนของ ApplicationHelper ของคุณได้
รถตู้

ใช้งานได้กับ Rails 4.1 แต่ยังจำเป็น ทำไมไม่เป็นค่าเริ่มต้น ... ควรรวมเฉพาะผู้ช่วยเหลือเฉพาะในกรณีที่จำเป็น (ตามที่ @vansan กล่าว)
OndřejŽelazko

27

ใน 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

10
เมื่อถึงเวลาที่คุณเรียกclear_helpersความเสียหาย (ประสิทธิภาพ) นั้นได้เกิดขึ้นแล้วเนื่องจากตัวช่วยทั้งหมดถูกโหลด คุณต้องการใช้จริงๆconfig.action_controller.include_all_helpers = false(ตามที่ @Craig Walker กล่าวไว้ด้านบน) เนื่องจากจะป้องกันไม่ให้ผู้ช่วยโหลดตั้งแต่แรกจึงได้รับประสิทธิภาพบางอย่าง (อาจสำคัญที่สุดในโหมดการพัฒนา) ขอบคุณที่รวมactioncontroller/base.rbข้อมูลโค้ด เป็นเรื่องดีเสมอที่ได้เห็นโค้ดและลบปริศนาบางอย่าง
George Anderson

clear_helpersยังคงมีประโยชน์สำหรับราง 3.0 - config.action_controller.include_all_helpers = falseเป็นเฉพาะราง 3.1 ขึ้นไป
ปล้น

5

จริงๆแล้วใน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:

  • เพิ่มว่าตอนนี้ ActionController :: Base เป็นผู้ช่วย: ทั้งหมดแทนที่จะอาศัย ApplicationController เริ่มต้นใน Rails เพื่อทำ [DHH]

1
นั่นหมายความว่าใน Rails 3 ตัวช่วยทั้งหมดเป็นค่าเริ่มต้นตลอดเวลาที่โหลดหรือไม่?
Nik So

@Nik แน่นอนใช่อย่างน้อยสำหรับ 3.2
Nithin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.