How do I make Rails time select to show only the hour part without the minutes? Basically what I want is to show a time filter with start_time
and end_time
and use Ransack
gem to filter the query.
# db
create_table "schedules"
t.time "start_time"
t.time "end_time"
# controller
@q = Schedule.ransack(params[:q])
@q.sorts = ['date asc', 'start_time asc', 'end_time asc'] if @q.sorts.empty?
@schedules = @q.result.includes(:klass, :partner, :city)
#view
<%= search_form_for @q do |f| %>
<%= f.label :start_time_gteq, "Start time" %>
<%= f.select_hour :start_time_gteq, start_hour: 5, end_hour: 23 %>
<%= f.submit "Filter" %>
<% end %>
But it gives me this error:
undefined method `select_hour' for #<Ransack::Helpers::FormBuilder:0x007fb85217e000>
I also tried:
<%= f.time_select :start_time_eq, start_hour: 5, end_hour: 23 %>
...but it shows the minute part. I checked with the API but there's no way to show only hours with the time_select
.
EDIT:
Apparently there is a way to remove the minute part:
<%= f.time_select :start_time_gteq, discard_minute: true %>
Unfortunately it also generates hidden input tags that defaulted to the system's current minute, which made the filtering useless.
Maybe it's time to just generate your own custom select rather than trying to force-fit the Rails helpers... perhaps something like this:
Depending on what input Ransack expects you may need to tweak the name and/or include a hidden field for the minutes: