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
Saya setuju dengan Anda semua bahwa ini dapat merusak pola MVC tetapi selalu ada alasan untuk merusak pola, dalam kasus saya, saya memerlukan metode formatter mata uang ini untuk menggunakannya dalam filter template ( Liquid dalam kasus saya).
Pada akhirnya saya menemukan bahwa saya dapat mengakses metode formatter mata uang ini menggunakan hal-hal seperti ini:
sumber
Saya tahu utas ini sudah sangat tua, tetapi seseorang dapat mencari solusi untuk masalah ini di Rails 4+. Pengembang menambahkan ActiveSupport :: NumberHelper, yang dapat digunakan tanpa mengakses modul / kelas terkait tampilan menggunakan:
ActiveSupport::NumberHelper.number_to_currency(amount, precision: 0)
sumber
number_to_percentage
di konsol Rails. Terima kasih!Anda juga perlu menyertakan ActionView :: Helpers :: NumberHelper
class Job < ActiveRecord::Base include ActionView::Helpers::NumberHelper include JobsHelper def details return "Only " + to_dollar(part_amount_received) + " out of " + to_dollar(price) + " received." end end
sumber
details
helper.Membonceng dari
@fguillen
respon, saya ingin menggantinumber_to_currency
metode dalamApplicationHelper
modul saya sehingga jika nilainya adalah0
ataublank
itu akan menghasilkan tanda hubung sebagai gantinya.Inilah kode saya jika kalian menemukan sesuatu seperti ini berguna:
module ApplicationHelper def number_to_currency(value) if value == 0 or value.blank? raw "–" else ActionController::Base.helpers.number_to_currency(value) end end end
sumber
Anda dapat menggunakan
view_context.number_to_currency
langsung dari pengontrol atau model Anda.sumber
Cara @ fguillen bagus, meskipun ada pendekatan yang sedikit lebih bersih, khususnya mengingat bahwa pertanyaan tersebut membuat dua referensi
to_dollar
. Saya pertama-tama akan mendemonstrasikan menggunakan kode Ryan Bates ( http://railscasts.com/episodes/132-helpers-outside-views ).def description "This category has #{helpers.pluralize(products.count, 'product')}." end def helpers ActionController::Base.helpers end
Perhatikan panggilannya
helpers.pluralize
. Ini dimungkinkan karena metode definition (def helpers
), yang hanya mengembalikanActionController::Base.helpers
. Oleh karena ituhelpers.pluralize
adalah kependekan dariActionController::Base.helpers.pluralize
. Sekarang Anda bisa menggunakanhelpers.pluralize
beberapa kali, tanpa mengulangi jalur modul yang panjang.Jadi saya kira jawaban untuk pertanyaan khusus ini bisa jadi:
class Job < ActiveRecord::Base include JobsHelper def details return "Only " + helpers.to_dollar(part_amount_received) + " out of " + helpers.to_dollar(price) + " received." end def helpers ActionView::Helpers::NumberHelper end end
sumber
Ini bukan latihan yang baik tapi berhasil untuk saya!
untuk mengimpor include ActionView :: Helpers :: NumberHelper di controller. Sebagai contoh:
class ProveedorController < ApplicationController include ActionView::Helpers::NumberHelper # layout 'example' # GET /proveedores/filtro # GET /proveedores/filtro.json def filtro @proveedores = Proveedor.all respond_to do |format| format.html # filtro.html.erb format.json { render json: @proveedores } end end def valuacion_cartera @total_valuacion = 0 facturas.each { |fac| @total_valuacion = @total_valuacion + fac.SumaDeImporte } @total = number_to_currency(@total_valuacion, :unit => "$ ") p '*'*80 p @total_valuacion end end
Semoga membantu Anda!
sumber
Benar-benar terkejut tidak ada satu orang pun yang berbicara tentang menggunakan Dekorator. Tujuan mereka adalah untuk menyelesaikan masalah yang Anda hadapi, dan banyak lagi.
https://github.com/drapergem/draper
EDIT: Sepertinya jawaban yang diterima pada dasarnya menyarankan untuk melakukan sesuatu seperti ini. Tapi ya, Anda ingin menggunakan dekorator. Berikut adalah seri tutorial bagus untuk membantu Anda lebih memahami:
https://gorails.com/episodes/decorators-from-scratch?autoplay=1
PS - @ excid3 Saya menerima bulan keanggotaan gratis LOL
sumber
Anda dapat membuat
include ActiveSupport::NumberHelper
modul, jika Anda tidak memerlukan fitur tambahan yang ditentukan olehActionView
.https://github.com/rails/rails/blob/44260581bec06e4ce05f3dd838c8b4736fc7eb1d/actionview/lib/action_view/helpers/number_helper.rb#L383
sumber
Metode pembantu umumnya digunakan untuk Melihat file. Ini bukan praktik yang baik untuk menggunakan metode ini di kelas Model. Tetapi jika Anda ingin menggunakan maka jawaban Sam tidak apa-apa. ATAU saya sarankan Anda dapat menulis metode kustom Anda sendiri.
sumber