私は似たようなことをしました。カスタムフォームビルダを使用して、時間と長さをフォーマットします。これは、既存のtext_fieldを利用し、その値をカスタマイズすることができるので、それをラップ:
class SuperFormBuilder < ActionView::Helpers::FormBuilder
include ApplicationHelper
include FormHelper
include ActionView::Helpers::TagHelper
include ActionView::Helpers::FormTagHelper
def length_field(label,*args)
scale = 'medium'
args.each do |v|
if v.has_key?(:scale)
scale = v[:scale]
v.delete(:scale)
end
end
value = length_conversion(@object.send(label.to_sym),scale)
options = (args.length > 0) ? args.pop : {}
return has_error(label, text_field_tag(field_name(label),value,*args) + ' ' + length_unit(scale))
end
private
def field_name(label)
return @object_name + "[#{label}]"
end
def has_error(label, output)
return "<div class='fieldWithErrors'>#{output}</div>" if @object.errors[label]
return output
end
、それはこのように使用されている:
<%= form_for(@section, {:action => 'save', :id => @section.id}, :builder => SuperFormBuilder) do |sf| %>
<%= sf.length_field :feed_size_min_w, :size => 3, :scale => 'small' %>
<% end %>
最終結果は基づいて、適切な単位の値でありますシステム(Metric、Imperial)およびIEの小数=インチまたはミリメートルでの選択をオフにします。
私は基本的にtext_field_tagを使用する既存のフォームビルダからtext_fieldメソッドをコピーしました。
2つの問題があります:1)オブジェクトフィールドの名前とオブジェクトにアクセスして、書式設定する値を取得する方法を知っています。 2)フォームが提出されたときに正しい名前を取得すると、正しいparamsハッシュの一部になります。
フォームビルダには、クラス変数@objectが与えられています。 .sendメソッドを使用してフィールドの値を取得できます。私の場合は、@ objectにfeed_size_min_wというラベルを送り、長さを戻します。それから私の望む形式に変換し、それをtext_field_tagに渡します。
フィールドの名前は、paramsハッシュで終わるための鍵です。私のインスタンスでは、params [:sections] oneです。私はこれを担当するfield_nameという小さなヘルパー関数を作った。
最後に、そのラベルにエラーがある場合、has_errorはエラーdiv内のフィールドをラップします。
私があるのかどうかを知りたいので、私はこの質問に恵みを開始しました:
あまりにも利用できるより多くの属性があります。 JDLと私自身が述べたものよりも良い答えです。それを持ってください! –