Hen*_*tto 5 ruby-on-rails simple-form
我是轨道上ruby和ruby的初学者,我正在尝试使用simple_form创建一个复杂的表单.一切都在运作,但我想以一种非常具体的方式自定义"时间"字段.
我用的时候:
<%= f.input :hour %>
Run Code Online (Sandbox Code Playgroud)
它呈现两个选择字段,即填充了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 %>
Run Code Online (Sandbox Code Playgroud)
虽然这解决了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>
Run Code Online (Sandbox Code Playgroud)
我很确定这很容易使用从8..21循环的集合实现,然后再次使用'00','15','30'和'45'循环,然后在语法中输出选项我想要(小时+"h"+分钟).
我想创建一个自定义的"日期"字段,因为在一个表单中会有很多日期字段(对于我正在创建的"约会"相关应用程序),但由于我是ruby on rails的初学者,我'我真的迷失了实现这一目标最聪明的方法.我不确定我是否应该在simple_form中实现自定义字段,如果我应该使用辅助函数,或者是什么.
在Simpleform的邮件列表的Carlos Antonio da Silva的帮助下,我们通过创建这样的自定义输入来修复此问题:
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
Run Code Online (Sandbox Code Playgroud)
然后<%= f.input :hora, :as => :hour %>在视图中.
根据 simpleform 的 google 邮件列表的建议,这就是我解决自己问题的方法:
在视图文件中,我创建了一个这样的输入:
<%= f.input :hour, collection: options_for_time_select, selected: f.object.hour.strftime("%H:%M:%S") %>
Run Code Online (Sandbox Code Playgroud)
在 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
Run Code Online (Sandbox Code Playgroud)
结尾
我不知道这是否是解决这个问题的最优雅的方法,或者它是否真的适用于所有场景。如果可能的话,我很想得到更正或更好的解决方案。
| 归档时间: |
|
| 查看次数: |
4097 次 |
| 最近记录: |