2

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

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

有没有人对轻松自定义 collection_select 的 text_method 有任何建议?

4

3 回答 3

4

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

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

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

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

于 2016-04-23T06:29:02.387 回答
2

放弃使用该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 应该不难。但是,从长远来看,上面的方法会更强大,并为您提供更多的选项和帮助,并让您在视图中一致地使用函数。

于 2016-04-23T05:57:36.513 回答
0

我最终以 GoGoCarl 的建议为基础,但将数组生成移到了帮助器上:

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

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

于 2016-04-24T03:22:11.513 回答