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

Ruby中当ends_at早于starts_at时,如何交换params对应参数值?

问题分析与修复方案

你的代码无法生效的核心原因是:交换参数的操作在booking对象初始化之后执行,导致修改后的params并没有被用来更新booking的属性。另外直接用字符串比较时间虽然在ISO8601格式下可行,但转换成时间对象进行比较更严谨,能避免潜在的格式异常问题。

修复步骤

  • 先处理参数的交换逻辑,再基于处理后的参数初始化booking对象
  • 将字符串格式的时间转换为Ruby时间对象后再进行比较

修复后的代码示例

def create
  # 提取并转换时间参数为时间对象
  starts_at = Time.parse(params[:starts_at])
  ends_at = Time.parse(params[:ends_at])

  # 若结束时间早于开始时间,交换参数值
  if ends_at < starts_at
    params[:starts_at], params[:ends_at] = params[:ends_at], params[:starts_at]
  end

  # 基于处理后的参数初始化booking(补充你实际需要的字段权限)
  booking = Booking.new(params.permit(:starts_at, :ends_at, ...))

  if !booking.save
    report_sentry_errors(booking)
    render json: booking.errors.messages, status: :unprocessable_entity
  else
    render 'show', status: :created
  end
end

额外说明

  • 若项目使用Rails自带的ActiveSupport,推荐用Time.zone.parse替代Time.parse,确保遵循项目配置的时区规则,避免时区偏差。
  • 建议添加参数格式校验逻辑,防止传入非ISO8601格式的时间字符串导致解析报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:30:17