5

在我的捐赠模型中,我已将 amount_cents 列货币化

我需要模型中捐赠金额的人性化版本(例如 643.50),以便我可以生成 PDF 收据并将其发送给捐赠者。

我试过 humanized_money(self.amount) 和 self.amount.humanized_money 但得到错误:

NoMethodError: undefined method `humanized_money' for #<Donation:0x007fa687ebb678>

如何在模型中获得这种人性化的形式?

class Donation < ActiveRecord::Base
  belongs_to :donatable, polymorphic: true
  belongs_to :added_by_user, foreign_key: "added_by", class_name: "User"

  store_accessor :details, :method

  monetize :amount_cents

  def donations_this_week(branch_id)
    sum =  Donation.sum(:amount_cents).to_money
    return humanized_money(sum)
  end

  def receipt
    Receipts::Receipt.new(
        id: id,
        product: "GoRails",
        message: "This receipt is to acknowledge that we have received a donation with the below details from #{self.donatable.name}",
        company: {
            name: self.donatable.branch.organization.name,
            address: "#{self.donatable.branch.address_line_1}\n#{self.donatable.branch.address_line_2}\n#{self.donatable.branch.email}\n#{self.donatable.branch.legal_details}",
            email: self.donatable.branch.email,
            logo: self.donatable.branch.organization.logo.url(:medium),
        },
        line_items: [
            ["Date",           created_at.to_s],
            ["Donor Name", self.donatable.name],
            ["Amount",         humanized_money(self.amount)],
            ["Payment Method",     self.method],
        ]
    )
  end
end

以下是数据库架构:

create_table "donations", force: :cascade do |t|
t.string   "donatable_type"
t.integer  "donatable_id"
t.integer  "amount_cents"
t.datetime "created_at",                  null: false
t.datetime "updated_at",                  null: false
t.datetime "date"
t.integer  "added_by"
t.jsonb    "details",        default: {}, null: false
4

5 回答 5

5

为此,无需将所有内容加载到ActionView::Base. 你可以做

return ActionController::Base.helpers.humanized_money sum
于 2016-01-08T20:01:03.367 回答
4

包括 ActionView::Base 会给你的模型添加很多额外的东西,不要这样做。

改为这样做:

include MoneyRails::ActionViewExtension

通过这种方式,您可以获得所有(在本文发表时为 5 个)money view 辅助方法。

于 2017-09-16T00:40:44.073 回答
2
NoMethodError: undefined method `humanized_money' for #<Donation:0x007fa687ebb678>

从错误消息中可以清楚地看出,您正在为对象而不是对象调用humanized_money辅助方法。这就是它失败的原因。DonationMoney

如果您amount_cents已经正确地通过该列获利,那么您的amount列将自动成为Moneyie 类型的Money对象,您可以将其作为参数传递给humanized_money辅助方法,如下所示:

humanized_money amount

我想说,检查你的类型amount并确保它是一个Money对象,如果你正确地从你的模型amount_cents的列中获利。Donation这就是为什么它在这种情况下不起作用。

更新

看起来是在money-rails gemhumanized_money中定义的,预计仅在视图中工作。不在模型中。action_view_extension

此问题的一个可能解决方案是在模型中包含ActionView::Base模块,这将使该humanized_money方法在模型中可用。然后你可以在你的模型中调用humanized_money,比如:

 include ActionView::Base
 humanized_money(sum)
于 2015-08-19T04:51:40.547 回答
1

不需要在模型中包含帮助程序。

price_options = {
  :no_cents_if_whole => MoneyRails::Configuration.no_cents_if_whole.nil? ? true : MoneyRails::Configuration.no_cents_if_whole,
  :symbol => true
}
your_money_column.format(price_options)

github上的源代码

于 2018-03-14T18:57:34.273 回答
0

KM Rakibul 关于帮助器未包含在 ActiveRecord 中的说法是正确的,但它们与ActionView::Base挂钩,因此要包含它们,请使用:

include ActionView::Base
于 2015-08-19T05:58:45.673 回答