15

我正在尝试编写一个简单的 Sinatra 东西,但我需要动作包中的 ActionView::Helpers::NumberHelper。 http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html

问题是,我该如何安装和使用它?

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

为什么这个简单的步骤不起作用?

此外,如果我需要所有的废话:

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

如何理解这一切?为什么这个模块不起作用?为什么它不需要它需要的任何东西?它需要什么?哪里是starts_with?

谷歌对这些问题完全保持沉默。

UPD:现在我得到以下信息

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

在我看来,我的 NumberHelper 坏了。这不是一个好的行为。

4

2 回答 2

29

所以,经过一番研究,我在 Rails 的 master 分支上发现了以下拉取请求

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

它几乎旨在ActionView::Helpers::NumberHelperActionViewActiveSupport

我还看到了一些封闭的问题,旨在解决一些允许包含NumberHelper为独立的问题。这意味着需要修复等。我没有找到一个未解决的问题,number_to_phone但问题的根源在于为类ActiveSupport添加了别名。我不确定他们是否在那里发现了那个错误。starts_with?String

无论如何,使用ActionView版本,3.2.13您可以执行以下操作

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

至于number_to_phone,那仍然会与当前版本中断。我正在做一个 PR 来解决这个问题。

编辑

至于语言环境问题,似乎如果您指定本地人,则需要在其中设置正确的选项I18n才能使其正常工作。如果您不提供语言环境,则默认值将如下所示{:separator=>".", :delimiter=>"", :precision=>3, :significant=>false, :strip_insignificant_zeros=>false},否则,哈希将为空并且会导致问题。不过,我似乎在 Rails 上找不到任何关于它的问题。

同样,这已在 master https://github.com/carlosantoniodasilva/rails/commit/f6b71499e967e03c65d53cc890585f42f3b8aaa2上的 PR 上修复

更新

ActiveSupport现在可以使用这些助手

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

于 2013-03-31T22:10:12.970 回答
6

最近变了:

require "active_support/all"

module Helpers
  extend ActiveSupport::NumberHelper
end

Helpers.number_to_currency(10.23) # => "$10.23"
于 2016-03-03T15:54:43.910 回答