How do I require NumberHelper and make it work?

2019-06-15 19:00发布

问题:

I'm trying to write a simple Sinatra thingy but I need ActionView::Helpers::NumberHelper from action pack. http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html

The question is, how do I install and use it?

irb(main):001:0> require 'action_view/helpers/number_helper'
irb(main):002:0> number_with_precision(1)
NoMethodError: undefined method `number_with_precision' for main:Object
irb(main):004:0> ActionView::Helpers::NumberHelper.number_with_precision(1)
NoMethodError: undefined method `number_with_precision' for ActionView::Helpers::NumberHelper:Module

Why doesn't this simple step work?

Moreover, if I require all the crap:

irb(main):001:0> require 'action_pack'
irb(main):004:0> require 'action_view'
irb(main):005:0> include ActionView::Helpers::NumberHelper
irb(main):006:0> number_to_phone(12345)
NoMethodError: undefined method `starts_with?' for "12345":String

How to make sense from all of this? Why does not this module work? Why doesn't it require whatever it needs? What does it need? Where is starts_with?

Google is utterly silent on those questions.

UPD: And now I get the following

number_with_precision(1, :locale => 'fr')
TypeError: wrong argument type nil (expected Fixnum)

It seems to me that my NumberHelper is broken. This isn't a good behavior.

回答1:

So, after doing a bit of research, I found the following pull request on the master branch of Rails

https://github.com/rails/rails/pull/6315

It pretty much aims to move ActionView::Helpers::NumberHelper from ActionView to ActiveSupport

I also saw a few closed issues that aimed to fix a few problems with allowing inclusion of NumberHelper as standalone. This means require fixes and such. I didn't find an open issue with the number_to_phone but the problem roots at the fact that ActiveSupport adds an alias starts_with? to the String class. I'm not sure if they have caught that bug there yet or not.

In any case, with ActionView version 3.2.13 you can do the following

require 'action_view'
include ActionView::Helpers::NumberHelper
number_with_precision 3.1
#=> "3.100"

As for the number_to_phone, that will still break with the current version. I'm making a PR to fix that issue at this moment.

EDIT

As for the locale issue, it seems that if you specify a local you need to have set the right options in the I18n for it to work. If you don't provide a locale the defaults will look like this {:separator=>".", :delimiter=>"", :precision=>3, :significant=>false, :strip_insignificant_zeros=>false}, otherwise, the hash will be empty and it will cause issues. I can't seem to find any issues about it on Rails though.

Again, this was fixed on a PR on master https://github.com/carlosantoniodasilva/rails/commit/f6b71499e967e03c65d53cc890585f42f3b8aaa2

UPDATE

You can use ActiveSupport now to use these helpers

http://api.rubyonrails.org/classes/ActiveSupport/NumberHelper.html



回答2:

It changed recently:

require "active_support/all"

module Helpers
  extend ActiveSupport::NumberHelper
end

Helpers.number_to_currency(10.23) # => "$10.23"