0

私は、collection_selectドロップダウンボックスに価格を表示するためのユースケースを持つRailsアプリを持っています。例えば、製品名とその価格、または顧客と金額。collection_selectのカスタムtext_methodのベストプラクティス?

number_to_currencyなどの関数にアクセスするために関連するヘルパーを単純に組み込むのは悪いMVCの習慣ですが、ProductまたはPaymentモデルのカスタムメソッドでできることは$ 20.2のような値になります。したがって、システムのほとんどのユーザーは20ドルと20セントが20.20ドルとなると予想されるため、判読可能ですが、最適ではありません。

誰にもcollection_selectのtext_methodを簡単にカスタマイズするための提案はありますか?

+0

モデル上のメソッドでは不可能だと言う理由を理解できません。 –

+0

私は 'float.to_s.split("。 ")[1] .length == 1'のように" 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では難しいはずがありません。しかし、上記の方法は、長期的にはより強力になり、ヘルパーにはもっと多くのオプションが用意され、ビュー全体で機能を一貫して使用できるようになります。 collection_select

+0

あなたの答えは素敵で正しいですが、あなたの最後の段落文はありません - あなたは 'collection_select'のカスタムフォーマッタを作成する必要はありません(詳細は私の答えを見てください) 。 – BoraMa

+0

@BoraMa注目されupvoted! – GoGoCarl

1

text_methodなどvalue_methodシンボルを受け入れるだけでなく、パラメータとして現在のコレクション要素を取得しますラムダ/ procのブロックを。ドキュメント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 

この方法です。

関連する問題