【问题标题】:Best practice for custom text_method in collection_select?collection_select 中自定义 text_method 的最佳实践?
【发布时间】:2016-08-16 20:47:55
【问题描述】:

我有一个带有用例的 Rails 应用程序,用于在 collection_select 下拉框中显示价格。例如,产品名称及其价格,或客户和欠款。

我很清楚,简单地包含相关帮助程序以访问 number_to_currency 等函数是一种不好的 MVC 做法,但我可以在 Product 或 Payment 模型上使用自定义方法做的最好的事情是获得一个看起来像 20.2 美元的值。因此,它可读但次优,因为系统的大多数用户将期望 20 美元和 20 美分表示为 20.20 美元。

有人对轻松自定义 collection_select 的 text_method 有什么建议吗?

【问题讨论】:

  • 我不明白你为什么说模型上的方法不可能?
  • 我可以使用float.to_s.split(".")[1].length == 1 之类的方法来添加“0”,但这有点不雅?
  • 只需使用 sprintf 方法sprintf("%.2f", float)。它像圆形,但双向工作

标签: html ruby-on-rails model-view-controller collection-select


【解决方案1】:

我最终根据 GoGoCarl 的建议进行构建,但将数组生成移到了帮助器:

module PaymentsHelper
  def invoices_for_payment_select(invoice)
    @invoices.collect { |i| ["#{i.client.name} - #{number_to_currency(i.outstanding)}", i.id] }
  end
end

这样我可以在需要时重复使用下拉框并保持视图整洁。

【讨论】:

    【解决方案2】:

    text_methodcollection_select 中的 value_method 接受一个符号,但也接受一个 lambda/proc 块,它将当前集合元素作为参数。请参阅文档here。 lambda 在视图的上下文中执行,因此所有视图助手都应该在其中可用。

    因此,要获得由货币格式化程序格式化的模型价格,您应该可以调用 collection_select,如下所示:

    <%= collection_select :user, :payment_id, @user.payments, 
                         :id, ->(pmt) { number_to_currency(pmt.amount) } %>
    

    您尚未显示您的模型关联,因此这只是一个用户有很多付款的示例,您希望在选择框文本中设置价格格式。

    【讨论】:

      【解决方案3】:

      放弃使用collection_select 方法,只在你的视图中使用select

      <% options = @payments.each { |p| number_to_currency(p.price), p.id } %>
      <%= f.select :payment, options %>
      

      因为您在视图中,所以您所期望的一切都在那里,包括模型和辅助方法。

      由于您没有给出具体示例,因此我正在对您的 HTML 做出假设,但我认为上面的代码块是您开始所需的一切。更多详情:http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-select

      如果您与collection_select 结婚,您可以随时滚动您自己的数字格式器用于货币;使用纯 Ruby 应该不难。但是,从长远来看,上面的方法会更加强大,并为您提供更多的选择,并让您有更多的选择,并让您可以跨视图一致地使用函数。

      【讨论】:

      • 只是一个小提示:虽然您的答案很好且正确,但您的最后一段陈述不是 - 您不必为 collection_select 创建自定义格式化程序(有关更多信息,请参阅我的答案) .
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多