0

У меня есть приложение Rails с прецедентом, чтобы показывать цены в раскрывающемся списке collection_select. Например, названия продуктов и их цены, а также клиенты и суммы.Лучшая практика для пользовательского text_method в collection_select?

Я знаю, что это неправда. Практика MVC просто включает соответствующие помощники, чтобы получить доступ к таким функциям, как number_to_currency, но лучшее, что я могу сделать с помощью настраиваемого метода в модели Product или Payment, получает значение, которое выглядит как $ 20.2. Таким образом, это читаемо, но не оптимально, так как большинство пользователей системы ожидают, что двадцать долларов и двадцать центов будут представлены как 20,20 доллара США.

Есть ли у кого-нибудь предложения по простой настройке text_method коллекции_select?

+0

Я не понимаю, почему вы говорите, что это невозможно с помощью метода на модели? –

+0

Я мог бы сделать что-то наподобие 'float.to_s.split (". ") [1] .length == 1 'to tack на« 0 », но это немного неэлегантно? – Paulus

+0

Просто используйте метод sprintf 'sprintf ("%. 2f ", float)'. Это похоже на круглое, но работает в обоих направлениях. –

ответ

1

оставлению судна с методом 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. Но вышеописанный метод будет более мощным в долгосрочной перспективе и предоставит вам больше возможностей с помощью помощников по линии, и позволит вам последовательно использовать функции для просмотра.

+0

Просто небольшое примечание: хотя ваш ответ хорош и правилен, ваш последний оператор абзаца не является - вам не нужно создавать собственный форматировщик для 'collection_select' (см. Мой ответ для получения дополнительной информации) , – BoraMa

+0

@BoraMa Отмечено и сохранено! – GoGoCarl

1

text_method, а также в value_methodcollection_select принимает символ, но и блок лямбда/ргос который будет получить текущий элемент коллекции в качестве параметра. См. Документы here. Лямбда выполняется в контексте представления, поэтому все доступные помощники должны быть доступны внутри него.

Так, чтобы получить цену модели, отформатированную валюты форматировщиком вы должны быть в состоянии назвать collection_select как следующее:

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

Вы не показали свои модели ассоциации, так что это просто пример пользователя имея много платежей, для которых вы хотите отформатировать цену в тексте окна выбора.

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 

Таким образом, я могу повторно использовать выпадающий список, я должен нужно и сохранить вид аккуратно.