Kullanılamaz çünkü bir modelde kullanımı (tipik olarak) MVC'yi ihlal eder (ve sizin durumunuzda öyle görünüyor). Verileri alıyorsunuz ve sunum için değiştiriyorsunuz. Bu, tanımı gereği, modele değil, görünüme aittir.
İşte bazı çözümler:
Model ve görünüm arasında uzlaşmak için bir sunum yapan kişi veya model görünümü nesnesi kullanın. Bu neredeyse kesinlikle diğer çözümlerden daha fazla ilk çalışma gerektirir, ancak neredeyse her zaman daha iyi bir tasarımdır. Bir sunum / görünüm modelinde yardımcıların kullanılması, geleneksel özel Rails yardımcılarının ve mantık dolu görünümlerin yerini alarak, görünüm katmanında yer aldıklarından MVC'yi ihlal etmez.
Açıkça include ActionView::Helpers::NumberHelper
içinde JobsHelper
yerine Raylar bağlı olarak sihirli sizin için yüklü olması. Modelden bir yardımcıya erişmemeniz gerektiği için bu hala harika değil.
MVC ve SRP'yi ihlal edin . Bunun nasıl yapılacağı konusunda fguillen'in cevabına bakın . Burada yinelemeyeceğim çünkü buna katılmıyorum. Dahası, Sam'in cevabında olduğu gibi, modelinizi sunum yöntemleriyle kirletmeye katılmıyorum .
"Ama benim modelime to_csv
& to_pdf
yöntemlerimi yazmak için buna gerçekten ihtiyacım var !" Diye düşünüyorsanız , tüm önermeniz yanlıştır - sonuçta, bir to_html
yönteminiz yok, değil mi? Yine de nesneniz genellikle HTML olarak işlenir. Veri modelinizin bir CSV'nin ne olduğunu bilmesini sağlamak yerine, çıktınızı oluşturmak için yeni bir sınıf oluşturmayı düşünün ( çünkü ).
Modeldeki ActiveModel doğrulama hataları için yardımcıları kullanmaya gelince, peki, üzgünüm ama ActiveModel / Rails, bir hatanın anlamsal fikrini geri döndürmek yerine, veri katmanında hata mesajlarını gerçekleştirmeye zorlayarak hepimizi mahvetti . daha sonra fark etti - iç çek . Bunu aşabilirsiniz, ancak temelde artık ActiveModel :: Errors kullanmamak anlamına gelir. Ben yaptım, iyi çalışıyor.
Bir kenara, aşağıda, yöntem kümesini kirletmeden bir sunucu / görünüm modeline yardımcıları dahil etmenin yararlı bir yolu var (çünkü örneğin yapabilmek MyPresenterOrViewModel.new.link_to(...)
mantıklı değil):
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