【问题标题】:Use a helper method on a interpolated string [duplicate]在插值字符串上使用辅助方法 [重复]
【发布时间】:2014-06-26 08:31:53
【问题描述】:

我正在寻找如何设置我的 :notice 以合并一个辅助方法,目前我有这个并获得“未定义的方法 to_dollars”:

notice: "Thank you for your payment of #{to_dollars(amount)}"

控制器

def create
  @donation = @campaign.donations.create(donation_params)
    if @donation.save_with_payment
      amount = @donation.donation_amount
      redirect_to @campaign, notice: "Thank you for your payment of #{to_dollars(amount)}"
    else
     flash[:notice] = @donation.errors
     render :new
  end
end

我的辅助方法很简单(除非有人有更好的方法)

def to_dollars(amount)
  convert = amount / 100
  number_to_currency(convert, unit: "$", separator: ".", delimiter: "")
end

所有的捐赠金额都以美分保存,因此只想将它们转换为美元。

【问题讨论】:

  • 什么问题我没有得到..
  • 那么问题是你想在控制器中使用辅助方法吗?
  • 抱歉,似乎错过了那部分,更新了问题,但在呈现通知时我得到未定义的方法 to_dollars

标签: ruby-on-rails ruby string-interpolation helpermethods


【解决方案1】:

在控制器中使用辅助方法不是一个好习惯,因为辅助方法是 UI 帮助功能的肉。如果你想在控制器中使用这个 to_dallers 辅助方法,那么你可以简单地在控制器中包含辅助模块。

请查看this answer

如果您必须在控制器中使用此 to_dollers 方法,则可以使用以下任一方法。

  • 您可以在 ActiveRecord consern 或单独的模块中编写此方法,并将其包含在它自身的模型中,以便您可以在对象本身上调用 to_dollers 方法。
  • 您可以将其包含在单独的模块中,例如 AmountUtility 模块,并将此类方法包含在此模块中。然后可以根据需要将此模块包含在任何地方。

希望这会有所帮助。

【讨论】:

  • 请改为重复标记
  • 我不同意。首先,您可能希望在某些非常特殊的情况下在控制器中使用格式化代码(闪存通知就是一个很好的例子)。其次,引用的答案没有提到AbstractController::Helpers#helper_method的使用,这是本案的正确答案。
  • 我提到的答案是在控制器本身中包含 helper 模块。即说你在module DonationAmountHelpers 中有to_dollers 方法,然后在控制器中写include DonationAmountHelpers,就是这样,你将在控制器中有to_doller 方法。 -------------------------------------------------- ---------------- 关于您在控制器中访问辅助方法的观点。我正在更新我的答案,请检查。
  • 是的,这就是问题所在 :) 当你想包含第三方助手时这很好,但是如果你自己编写一个助手然后将它加载到控制器中,它可能不应该被定义为首先是助手,但作为 lib 或关注哪些方法作为助手加载(使用#helper_method)。当然,如果以其他方式执行,应用程序不会崩溃,但这正是指南“不要在控制器中包含帮助程序”的意思。
猜你喜欢
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多