Nie jest dostępny, ponieważ jego użycie w modelu (zazwyczaj) narusza MVC (i wydaje się, że tak jest w Twoim przypadku). Pobierasz dane i manipulujesz nimi w celu prezentacji. To z definicji należy do widoku, a nie do modelu.
Oto kilka rozwiązań:
Użyj prezentera lub obiektu widoku modelu, aby pośredniczyć między modelem a widokiem. To prawie na pewno wymaga więcej wstępnej pracy niż inne rozwiązania, ale prawie zawsze jest lepszym projektem. Używanie pomocników w modelu prezentera / widoku nie narusza MVC, ponieważ znajdują się one w warstwie widoku, zastępując tradycyjne niestandardowe pomocniki Rails i widoki wypełnione logiką.
Jawnie include ActionView::Helpers::NumberHelper
w JobsHelper
zamiast polegać na Railsach, które magicznie go załadowały. To nadal nie jest świetne, ponieważ nie powinieneś mieć dostępu do pomocnika z modelu.
Naruszaj MVC i SRP . Zobacz odpowiedź fguillen, jak to zrobić. Nie powtórzę tego tutaj, ponieważ się z tym nie zgadzam. Tym bardziej jednak nie zgadzam się z zanieczyszczeniem twojego modelu metodami prezentacji, jak w odpowiedzi Sama .
Jeśli myślisz „ale naprawdę potrzebuję tego, aby zapisać moje to_csv
& to_pdf
metody w moim modelu!”, To całe twoje założenie jest błędne - w końcu nie masz to_html
metody, prawda? A jednak twój obiekt jest bardzo często renderowany jako HTML. Rozważ utworzenie nowej klasy do generowania wyników, zamiast informowania modelu danych, czym jest plik CSV ( ponieważ nie powinien ).
Jeśli chodzi o używanie pomocników do błędów walidacji ActiveModel w modelu, cóż, przykro mi, ale ActiveModel / Rails nas w to wkręciły, zmuszając komunikaty o błędach do realizacji w warstwie danych, zamiast zwracać semantyczną ideę błędu do uświadomiłem sobie później - westchnij . Możesz to obejść, ale w zasadzie oznacza to, że nie używasz już ActiveModel :: Errors. Zrobiłem to, działa dobrze.
Na marginesie, oto przydatny sposób na włączenie pomocników do modelu prezentera / widoku bez zanieczyszczania jego zestawu metod (ponieważ możliwość robienia np. Nie MyPresenterOrViewModel.new.link_to(...)
ma sensu):
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
Zgadzam się z wami wszystkimi, że może to zepsuć wzorzec MVC, ale zawsze są powody do złamania wzorca, w moim przypadku potrzebowałem tych metod formatowania walut, aby użyć ich w filtrze szablonu ( Płynne w moim przypadku ).
W końcu dowiedziałem się, że mogę uzyskać dostęp do tych metod formatowania walut, używając takich rzeczy:
źródło
Wiem, że ten wątek jest bardzo stary, ale ktoś może poszukać rozwiązania tego problemu w Railsach 4+. Deweloperzy dodali ActiveSupport :: NumberHelper, z którego można korzystać bez dostępu do powiązanych modułów / klas za pomocą:
ActiveSupport::NumberHelper.number_to_currency(amount, precision: 0)
źródło
number_to_percentage
konsoli Railsów. Dzięki!Musisz również dołączyć 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
źródło
details
pomocnika.Odsuwając się od
@fguillen
odpowiedzi, chciałem przesłonićnumber_to_currency
metodę w moimApplicationHelper
module, tak aby jeśli wartość była0
lubblank
, zamiast tego wyświetlałaby myślnik.Oto mój kod na wypadek, gdybyście uznali coś takiego za przydatne:
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
źródło
Możesz używać
view_context.number_to_currency
bezpośrednio ze swojego kontrolera lub modelu.źródło
Sposób @ fguillen jest dobry, chociaż tutaj jest nieco czystsze podejście, szczególnie biorąc pod uwagę, że pytanie zawiera dwa odniesienia do
to_dollar
. Najpierw zademonstruję przy użyciu kodu Ryana Batesa ( 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
Zwróć uwagę na wezwanie
helpers.pluralize
. Jest to możliwe dzięki definicji metody (def helpers
), która po prostu zwracaActionController::Base.helpers
. Dlategohelpers.pluralize
jest skrótem odActionController::Base.helpers.pluralize
. Teraz możesz użyćhelpers.pluralize
wiele razy, bez powtarzania długich ścieżek modułów.Więc przypuszczam, że odpowiedź na to konkretne pytanie mogłaby brzmieć:
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
źródło
To nie jest dobra praktyka, ale dla mnie działa!
aby zaimportować dołącz ActionView :: Helpers :: NumberHelper do kontrolera. Na przykład:
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
Mam nadzieję, że ci to pomoże!
źródło
Naprawdę zaskoczony, że nikt nie mówił o używaniu dekoratora. Ich celem jest rozwiązanie napotkanego problemu i nie tylko.
https://github.com/drapergem/draper
EDYCJA: Wygląda na to, że zaakceptowana odpowiedź w zasadzie sugerowała zrobienie czegoś takiego. Ale tak, chcesz użyć dekoratorów. Oto świetna seria samouczków, które pomogą Ci lepiej zrozumieć:
https://gorails.com/episodes/decorators-from-scratch?autoplay=1
PS - @ excid3 Akceptuję darmowe miesiące członkostwa LOL
źródło
Możesz po prostu
include ActiveSupport::NumberHelper
moduł, jeśli nie potrzebujesz dodatkowych funkcji zdefiniowanych przezActionView
.https://github.com/rails/rails/blob/44260581bec06e4ce05f3dd838c8b4736fc7eb1d/actionview/lib/action_view/helpers/number_helper.rb#L383
źródło
Metody pomocnicze są zwykle używane do wyświetlania plików. Używanie tych metod w klasie Model nie jest dobrą praktyką. Ale jeśli chcesz użyć, odpowiedź Sama jest w porządku. LUB proponuję napisać własną niestandardową metodę.
źródło