【问题标题】:populating a custom time field on ruby on rails with simple_form使用 simple_form 在 ruby​​ on rails 上填充自定义时间字段
【发布时间】:2013-01-07 13:26:58
【问题描述】:

我是 ruby​​ 和 ruby​​ on rails 的初学者,我正在尝试使用 simple_form 创建一个复杂的表单。一切正常,但我想以一种非常具体的方式自定义“时间”字段。

当我使用时:

<%= f.input :hour %>

它呈现两个选择字段,“小时”字段填充了 00 到 23 的选项,“分钟”字段填充了 00 到 59 的选项。

但这不是我想要的。我想用一个带有自定义预填充选项的选择字段替换两个选择字段的时间使用,时间范围从上午 8 点到下午 22 点,增量为 15 分钟,并且选项的文本也显示时间语法“8h00”、“8h15”、“8h30”、“8h45”、“9h00”、“18h00”、“18h15”、“18h30”、“18h45”等。“21h45”是最后一个可用的选项。

我已经设法使用这些选项对其进行了更多自定义:

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

虽然这解决了 15 分钟增量问题,但它仍然呈现两个选择字段。

这将是我想要为我呈现 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”+分钟)。

我想创建一个自定义的“日期”字段,因为单个表单中有许多日期字段(对于我正在创建的“约会”相关应用程序),但因为我是 ruby​​ on rails 的初学者,我真的不知道什么是最聪明的实现方式。我不确定是否应该在 simple_form 中实现自定义字段,是否应该使用辅助函数,或者什么。

【问题讨论】:

    标签: ruby-on-rails simple-form


    【解决方案1】:

    在来自 simpleform 邮件列表的 Carlos Antonio da Silva 的帮助下,我们通过创建如下自定义输入来解决此问题:

    app/inputs/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
    

    然后在视图中&lt;%= f.input :hora, :as =&gt; :hour %&gt;

    【讨论】:

      【解决方案2】:

      根据 simpleform 的谷歌邮件列表的建议,这就是我解决自己问题的方法:

      在视图文件中,我创建了这样的输入:

      <%= 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
      

      结束

      我不知道这是否是解决这个问题的最优雅的方法,或者它是否真的适用于所有场景。如果可能的话,我希望得到更正或更好的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-16
        • 2014-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多