ไม่สามารถใช้งานได้เนื่องจากการใช้งานในโมเดล (โดยทั่วไป) ละเมิด MVC (และดูเหมือนว่าในกรณีของคุณ) คุณกำลังรับข้อมูลและจัดการข้อมูลเพื่อนำเสนอ ตามความหมายแล้วสิ่งนี้อยู่ในมุมมองไม่ใช่โมเดล
วิธีแก้ไขมีดังนี้
ใช้ผู้นำเสนอหรือดูโมเดลวัตถุเพื่อเป็นสื่อกลางระหว่างโมเดลและมุมมอง เกือบจะแน่นอนว่าต้องใช้งานเริ่มต้นมากกว่าโซลูชันอื่น ๆ แต่มักจะเป็นการออกแบบที่ดีกว่า การใช้ตัวช่วยในผู้นำเสนอ / โมเดลมุมมองไม่ได้ละเมิด MVC เนื่องจากพวกเขาอยู่ในเลเยอร์มุมมองแทนที่ตัวช่วย Rails แบบกำหนดเองแบบเดิมและมุมมองที่เต็มไปด้วยตรรกะ
อย่างชัดเจนinclude ActionView::Helpers::NumberHelper
ในJobsHelper
แทนขึ้นอยู่กับทางรถไฟที่จะมีการโหลดอย่างน่าอัศจรรย์สำหรับคุณ สิ่งนี้ยังไม่ดีนักเนื่องจากคุณไม่ควรเข้าถึงตัวช่วยจากแบบจำลอง
ละเมิด MVC และSRP ดูคำตอบของ fguillenสำหรับวิธีการทำเช่นนี้ ฉันจะไม่สะท้อนมันที่นี่เพราะฉันไม่เห็นด้วยกับมัน มากยิ่งขึ้นดังนั้นแม้ว่าฉันจะไม่เห็นด้วยกับมลพิษรูปแบบของคุณด้วยวิธีการนำเสนอในขณะที่คำตอบของแซม
หากคุณคิดว่า“ แต่ฉันต้องการสิ่งนี้จริงๆเพื่อเขียนto_csv
& to_pdf
วิธีการในแบบจำลองของฉัน!” แสดงว่าหลักฐานทั้งหมดของคุณไม่ถูกต้องเพราะคุณไม่มีto_html
วิธีใช่ไหม แต่วัตถุของคุณมักแสดงผลเป็น HTML ลองสร้างคลาสใหม่สำหรับสร้างผลลัพธ์ของคุณแทนที่จะทำให้โมเดลข้อมูลของคุณรู้ว่า CSV คืออะไร ( เพราะไม่ควรทำ )
สำหรับการใช้ตัวช่วยสำหรับข้อผิดพลาดการตรวจสอบความถูกต้องของ ActiveModel ในโมเดลฉันขอโทษ แต่ ActiveModel / Rails ทำให้เราทุกคนพลาดที่นั่นด้วยการบังคับให้ข้อความแสดงข้อผิดพลาดรับรู้ในชั้นข้อมูลแทนที่จะส่งกลับแนวคิดเชิงความหมายของข้อผิดพลาดให้เป็น ตระหนัก later- ถอนหายใจ คุณสามารถแก้ไขสิ่งนี้ได้ แต่โดยพื้นฐานแล้วหมายความว่าจะไม่ใช้ ActiveModel :: Errors อีกต่อไป ฉันทำแล้วมันได้ผลดี
นอกจากนี้ยังเป็นวิธีที่มีประโยชน์ในการรวมผู้ช่วยเหลือไว้ในผู้นำเสนอ / มุมมองแบบจำลองโดยไม่ทำให้ชุดวิธีการของมันเป็นมลพิษ (เพราะสามารถทำได้เช่นMyPresenterOrViewModel.new.link_to(...)
ไม่มีเหตุผล):
class MyPresenterOrViewModel
def some_field
helper.number_to_currency(amount, :precision => 0)
end
private
def helper
@helper ||= Class.new do
include ActionView::Helpers::NumberHelper
end.new
end
end