5

ruby および ruby​​ on rails の初心者で、simple_form を使用して複雑なフォームを作成しようとしています。すべてがすでに機能していますが、「時間」フィールドを非常に具体的な方法でカスタマイズしたかったのです。

私が使用する場合:

<%= f.input :hour %>

00 から 23 までのオプションが入力された「時間」フィールドと、00 から 59 までのオプションが入力された「分」フィールドの 2 つの選択フィールドをレンダリングします。

しかし、それは私が望むものではありません。時間の 2 つの選択フィールドの使用を、事前入力されたカスタム オプションを含む 1 つの選択フィールドに置き換えたいと思います。時間の範囲は、午前 8 時から午後 22 時までで、15 分刻みです。構文 "8h00"、"8h15"、"8h30"、"8h45"、"9h00"、"18h00"、"18h15"、"18h30"、"18h45" など。"21h45" は利用可能な最後のオプションです。

これらのオプションを使用して、もう少しカスタマイズすることができました。

<%= f.input :hour, :as => :time, :minute_step => 15 %>

これで 15 分のインクリメントの問題は解決されますが、それでも 2 つの選択フィールドがレンダリングされます。

これは、私が simple_form をレンダリングしたかったものと同等の html になります。

<select name="hour">
<option value="08:00:00">08h00</option>
<option value="08:15:00">08h15</option>
<option value="08:30:00">08h30</option>
<option value="08:45:00">08h45</option>
...
<option value="21:30:00">21h30</option>
<option value="21:45:00">21h45</option>
</select>

これは、8..21 からループし、'00'、'15'、'30'、'45' で再びループし、次の構文でオプションを出力するコレクションを使用して実装するのが非常に簡単であると確信しています。 (時間 + "h" + 分) が必要です。

カスタムの「日付」フィールドを作成したいのは、1 つのフォームに多くの日付フィールドがあるためです (作成中の「予定」関連のアプリケーション用)。しかし、私は ruby​​ on rails の初心者なので、これを実装するための最もスマートな方法は何か、本当に迷いました。simple_form にカスタム フィールドを実装する必要があるかどうか、ヘルパー関数を使用する必要があるかどうか、または何を使用する必要があるかがわかりません。

4

2 に答える 2

8

simpleform のメーリング リストの Carlos Antonio da Silva の助けを借りて、次のようなカスタム入力を作成することでこれを修正しました。

アプリ/入力/hour_input.rb

class HourInput < SimpleForm::Inputs::Base
  def input
    @builder.select(attribute_name, hour_options, { :selected => selected_value }, { :class => "input-medium" })
  end

  private

  # The "Selecione..." string could also be translated with something like: I18n.t("helpers.select.prompt')
  def hour_options
    hour = [['Selecione...', '00:00:00']]
    (8..21).each do |h|
      %w(00 15 30 45).each do |m|
        hour.push ["#{h}h#{m}", "#{"%02d" % h}:#{m}:00"]
      end
    end
    hour
  end

  def selected_value
    value = object.send(attribute_name)
    value && value.strftime("%H:%M:%S")
  end
end

そして<%= f.input :hora, :as => :hour %>ビューで。

于 2013-01-25T02:24:22.633 に答える
5

simpleformのGoogleメーリングリストからの提案により、これが私自身の問題をどのように修正したかです:

ビューファイルで、次のような入力を作成しました。

<%= f.input :hour, collection: options_for_time_select, selected: f.object.hour.strftime("%H:%M:%S") %>

そして、application_helper.rb ファイルで、次の方法で関数を作成しました。

module ApplicationHelper
def options_for_time_select
    hour = Array.new
    for $h in 8..21 do
        for $m in ['00', '15', '30', '45'] do
            hour.push [$h.to_s + "h" + $m.to_s, "%02d" % $h + ":" + $m + ":00"]
        end
    end
    hour
end

終わり

これがこの問題を解決する最もエレガントな方法なのか、それとも本当にすべてのシナリオで機能するのかはわかりません。可能であれば、修正またはより良い解決策を入手したいと思います。

于 2013-01-24T06:36:15.427 に答える