更新记录时如何将nil的manufacture_date设为registration_date的值?
解决方案
你可以通过判断传入的manufacture_date参数是否为空,来决定是否用registration_date的值填充,具体代码实现如下:
假设你的控制器update动作里已经获取了要更新的@car对象,修改manufacture_date的处理逻辑:
# 处理manufacture_date参数,空值或nil时返回nil manufacture_date_input = params[:car][:manufacture_date].presence # 获取有效的registration_date:优先用用户提交的参数,没有则用记录原有值 registration_date = Date.parse( params[:car][:registration_date] || @car.registration_date ) # 确定最终的manufacture_date:有输入则解析输入,否则用registration_date new_manufacture_date = manufacture_date_input ? Date.parse(manufacture_date_input) : registration_date # 赋值给car对象 @car.manufacture_date = new_manufacture_date
关键逻辑说明
- 使用
.presence方法:可以同时处理参数为nil或空字符串的情况,返回nil表示无有效输入 - 优先取用户提交的
registration_date:如果用户本次更新了registration_date,就用新值;没更新则用记录原有的值(因为registration_date不可为空,所以肯定有值) - 三元表达式分支:确保
new_manufacture_date永远不会是nil
如果需要处理日期格式错误的情况(比如用户输入的日期格式不合法),可以添加异常捕获:
begin manufacture_date_input = params[:car][:manufacture_date].presence registration_date = Date.parse(params[:car][:registration_date] || @car.registration_date) new_manufacture_date = manufacture_date_input ? Date.parse(manufacture_date_input) : registration_date rescue ArgumentError # 这里可以添加格式错误的处理逻辑,比如返回错误提示 flash[:error] = "日期格式不正确" redirect_to edit_car_path(@car) and return end
内容的提问来源于stack exchange,提问作者Solitary Coder
相关产品推荐
相关产品推荐

