Rails 4:为什么包含在类中的助手是继承的,但是类的实例方法不是

时间:2015-09-25 11:36:13

标签: ruby ruby-on-rails-4

我在models / item.rb中定义了一个实例方法(其中someAmt是Item的一个属性),如下所示:

include ActionView::Helpers::NumberHelper
class Item < ActiveResource::Base
  self.site = "http://localhost:8080/xxxx/"

  def displayInDollar(num)
    return "$#{number_with_precision(BigDecimal(num)/100,
      :precision => 2)}"
  end
end

并尝试使用index.html.erb中的方法(这不起作用,因为该方法是一个实例方法):

<tr>
  <td class="item_total">
    <%= @items.displayInDollar(BigDecimal(@items.sum(&:someAmt))/100, precision: 2) %>
  </td>
</tr>

但是我可以使用我在模型项中包含的number_to_currency帮助器:

<tr>
  <td class="item_total">
    <%= @items.number_to_currency(BigDecimal(@items.sum(&:someAmt))/100, precision: 2) %>
  </td>
</tr>

这是因为NumberHelper已被自动包含,或者为什么?

1 个答案:

答案 0 :(得分:0)

这里有很多错误。首先,在类之外执行include方法。这将导致模块包含在Object类中,因此将使应用程序中的每个对象都可以使用所有方法。这就是您可以使用@items.number_to_currency的原因。您还可以使用nil.number_to_currency15.5.number_to_currencyfalse.number_to_currency。这是错的。

现在,即使你在课堂内移动它,它仍然无效。 @itemsActiveRecord::Relations(最有可能)的一个实例或项目集合。您的方法是一个实例方法,只能在单个项目上调用。

话虽这么说,这个方法甚至不应该是你的Item的实例方法,因为这会打破MVC模式。此方法的唯一目的是以美元显示给定值,这是典型的视图关注点。它甚至不使用任何模型属性。它应放在帮助者中。