You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Tempus Dominus Bootstrap4时参数丢失的问题排查

解决Tempus Dominus Datetime Picker提交后时间解析的TypeError问题

我帮你梳理下问题根源和对应的解决方案:

核心问题分析

  1. 参数获取逻辑错误:你在create方法里直接调用params[:title]、params[:start_time]等,但从提交日志能看到,所有表单参数都嵌套在params[:event]对象中,直接取顶级参数会返回nil——这就是触发no implicit conversion of nil into String错误的根本原因。更关键的是,你已经定义了Rails推荐的强参数event_params,却完全没用到它。

  2. 时间格式不匹配:你的time_parse方法用了'%m/%d/%Y %M:%S %p'格式字符串,但日志里的时间是"02/21/2020 1:26 PM"——这个格式没有秒数,小时是1位的12小时制,当前的格式字符串完全不匹配,就算参数能拿到,也会解析失败。

  3. 低级笔误:create方法里的end_time错误传入了params[:start_time],这会导致结束时间和开始时间完全一致。

修正后的控制器代码

class EventsController < ApplicationController
  def new
    @event = Event.new
  end

  def create
    @user = current_user
    if @user
      # 先获取强参数,再处理时间解析
      event_attributes = event_params.to_h
      event_attributes[:start_time] = time_parse(event_attributes[:start_time])
      event_attributes[:end_time] = time_parse(event_attributes[:end_time])
      @user.events.create(event_attributes)
    end
    # 建议添加创建后的跳转逻辑,提升用户体验
    redirect_to events_path, notice: "Event created successfully!"
  end

  private

  def event_params
    params.require(:event).permit(:title, :game, :start_time,:end_time, :description)
  end

  def time_parse(time_str)
    # 匹配日志里的时间格式: "02/21/2020 1:26 PM"
    # %m=两位月份, %d=两位日期, %Y=四位年份, %l=1位12小时制小时, %M=两位分钟, %p=AM/PM标识
    DateTime.strptime(time_str, '%m/%d/%Y %l:%M %p')
    # 如果前端实际提交的是"February 21, 2020 1:26 PM"(对应JS里的format),替换为下面的格式
    # DateTime.strptime(time_str, '%B %d, %Y %l:%M %p')
  end
end

前端代码的一致性优化

你的JS里设置的datetimepicker显示格式是'MMMM D, YYYY h:mm A'(比如February 21, 2020 1:26 PM),但日志里提交的是数字格式日期,这里存在格式不一致的情况,建议统一:

  • 如果想让用户看到友好的长格式,但提交简洁的数字格式,可以给datetimepicker添加formatInput配置;
  • 保持视图里的strftime格式和JS的format一致,避免显示与提交格式混乱:
    <%= form.text_field(:start_time, value: form.object.start_time ? form.object.start_time.strftime('%B %d, %Y %l:%M %p') : nil, class: "form-control datetimepicker-input", data: {target:"#datetimepicker1"}) %>
    

另外,请确保你的Event模型中start_time和end_time字段是datetime类型,这样Rails能更好地兼容时间解析逻辑。

内容的提问来源于stack exchange,提问作者Eojo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:32:50