我有一个带有用例的Rails应用程序,可以在collection_select下拉框中显示价格。例如,产品名称及其价格,客户和欠款。
我知道简单地包含相关帮助程序来访问number_to_currency之类的函数是不好的MVC实践,但是我在Product或Payment模型上使用自定义方法做的最好的事情是得到一个看起来像$ 20.2的值。因此,它可读但次优,因为该系统的大多数用户将期望20美元和20美分表示为20.20美元。
有没有人有任何建议可以轻松自定义collection_select的text_method?
答案 0 :(得分: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应该不难。但是,从长远来看,上述方法将更加强大,并为您提供更多选项,让您在整个视图中使用一致的功能。
答案 1 :(得分:1)
text_method
以及value_method
中的collection_select
接受一个符号,但一个lambda / proc块,它会将当前的集合元素作为一个参数。请参阅文档here。 lambda在视图的上下文中执行,因此所有视图助手都应该在其中可用。
因此,为了获得由货币格式化程序格式化的模型价格,您应该能够像下面这样调用collection_select
:
<%= collection_select :user, :payment_id, @user.payments,
:id, ->(pmt) { number_to_currency(pmt.amount) } %>
您尚未显示您的模型关联,因此这只是一个用户需要在选择框文本中格式化价格的付款的示例。
答案 2 :(得分:0)
我最终建立了GoGoCarl的建议,但将阵列生成转移到了帮手:
#include "stdio.h"
int main()
{
int n[10] = { 1,1,1,1,1,1,1,1,1,1 };
int m = 10;
for (int i = 0; i < m; i++)
{
for (int j = i + 1; j < m; j++)
{
if (n[i] == n[j])
{
for (int k = j; k < m - 1; k++)
{
n[k] = n[k + 1];
}
m--;
j--;
}
}
}
for (int i = 0; i < m; i++)
{
printf("%d\n", n[i]);
}
return 0;
}
这样我可以在需要时重复使用下拉框并保持视图整洁。