collection_select中自定义text_method的最佳实践?

时间:2016-04-23 05:35:31

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

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

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

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

3 个答案:

答案 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;
}

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