Ini tidak tersedia karena penggunaannya dalam model (biasanya) melanggar MVC (dan tampaknya dalam kasus Anda). Anda mengambil data dan memanipulasinya untuk presentasi. Ini, menurut definisi, termasuk dalam tampilan, bukan modelnya.
Berikut beberapa solusinya:
Gunakan presenter atau objek model tampilan untuk menengahi antara model dan tampilan. Ini hampir pasti membutuhkan lebih banyak pekerjaan awal daripada solusi lain, tetapi hampir selalu merupakan desain yang lebih baik. Menggunakan pembantu dalam presenter / view-model tidak melanggar MVC, karena mereka berada di lapisan tampilan, menggantikan pembantu Rails kustom tradisional dan tampilan yang dipenuhi logika.
Secara eksplisit include ActionView::Helpers::NumberHelper
dalam JobsHelper
alih-alih bergantung pada Rails untuk memuatnya secara ajaib untuk Anda. Ini masih belum bagus, karena Anda seharusnya tidak mengakses helper dari model.
Melanggar MVC & SRP . Lihat jawaban fguillen untuk bagaimana melakukan ini. Saya tidak akan mengulanginya di sini karena saya tidak setuju dengannya. Terlebih lagi, apakah saya tidak setuju dengan mencemari model Anda dengan metode presentasi seperti dalam jawaban Sam .
Jika Anda berpikir "tetapi saya benar-benar membutuhkan ini untuk menulis metode to_csv
& saya to_pdf
dalam model saya!", Maka keseluruhan premis Anda salah — lagipula, Anda tidak memiliki to_html
metode, bukan? Namun objek Anda sangat sering dirender sebagai HTML. Pertimbangkan untuk membuat kelas baru untuk menghasilkan keluaran daripada membuat model data Anda mengetahui apa itu CSV ( karena seharusnya tidak ).
Adapun untuk menggunakan pembantu untuk kesalahan validasi ActiveModel dalam model, saya minta maaf tetapi ActiveModel / Rails telah mengacaukan kita semua di sana dengan memaksa pesan kesalahan untuk direalisasikan di lapisan data, daripada mengembalikan ide semantik dari kesalahan menjadi disadari kemudian— mendesah . Anda bisa menyiasati ini, tetapi pada dasarnya berarti tidak menggunakan ActiveModel :: Errors lagi. Saya telah melakukannya, itu bekerja dengan baik.
Selain itu, berikut adalah cara yang berguna untuk menyertakan pembantu dalam penyaji / model tampilan tanpa mencemari kumpulan metodenya (karena mampu melakukan misalnya MyPresenterOrViewModel.new.link_to(...)
tidak masuk akal):
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