Separate date and time form fields in Rails

后端 未结 5 672
轮回少年
轮回少年 2020-12-23 16:43

I have an ActiveRecord model Eventwith a datetime column starts_at. I would like to present a form, where date and time for starts_at

5条回答
  •  感情败类
    2020-12-23 17:24

    Using a date_select and time_select is a good way to go.

    However, I wanted a text_field for the date (so I can use a JavaScript date picker).

    Using strong_parameters or Rails 4+:

    models/event.rb

    # Add a virtual attribute
    attr_accessor :start_at_date
    

    views/events/_form.html.haml

    - # A text field for the date, and time_select for time
    = f.label :start_at
    = f.text_field :start_at_date, value: (f.object.start_at.present? ? f.object.start_at.to_date : nil)
    = f.time_select :start_at, :ignore_date => true
    

    controllers/events_controller.rb

    # If using a date_select, time_select, datetime_select
    # Rails expects multiparameter attributes
    # Convert the date to the muiltiparameter parts
    def event_params
      if !!params[:event] && (params[:event]["start_at(4i)"].present? || params[:event]["start_at(5i)"].present?)
    
        if params[:event][:start_at_date].present?
          start_at_date = params[:event][:start_at_date]
        else
          start_at_date = Date.today
        end
        year  = start_at_date.match(/^(\d{4})[\-\/]/)[1]
        month = start_at_date.match(/[\-\/](\d{2})[\-\/]/)[1]
        day   = start_at_date.match(/[\-\/](\d{2})$/)[1]
        params[:event]["start_at(1i)"] = year
        params[:event]["start_at(2i)"] = month
        params[:event]["start_at(3i)"] = day
      end
      ...
    

提交回复
热议问题