Ruby on Rails中如何基于输入日期批量创建记录并正确保存参数
问题修复方案
核心错误点
- Rails Model 层无法直接访问控制器的
params对象,原有回调逻辑中的params调用会直接抛出未定义变量错误 after_save为记录保存完成后触发的回调,在回调中修改当前实例属性不会自动持久化,循环修改同一实例也无法生成新记录- 控制器缺失
create方法,未完成参数接收、实例赋值、持久化的核心逻辑 - 视图中对日期参数做
to_i转换,会将日期转为时间戳,无法正确解析为日期格式
调整后代码
1. 控制器修改
# ./app/controllers/user_jobs_controller.rb def new @user_job = UserJob.new end def create # 提取业务参数 job_name = user_job_params[:name] begin base_date = Date.parse(params[:dateuser]) rescue Date::Error @user_job = UserJob.new(user_job_params) flash.now[:alert] = "日期格式错误,请重新选择" render :new and return end add_days = params[:dateadd].to_i # 事务包裹批量创建,保证数据一致性 UserJob.transaction do (add_days + 1).times do |offset| UserJob.create!( name: job_name, dateuser: base_date + offset.days ) end end redirect_to user_jobs_path, notice: "批量创建成功,共生成#{add_days + 1}条记录" rescue ActiveRecord::RecordInvalid => e @user_job = UserJob.new(user_job_params) flash.now[:alert] = "创建失败:#{e.message}" render :new end private def user_job_params params.require(:user_job).permit(:name) end
2. 模型修改
删除原有 after_save 回调及关联的 save_default_values 方法,仅保留必要验证即可:
# app/models/user_job.rb validates :name, :dateuser, presence: true
3. 视图修改
调整输入框类型,优化用户输入体验,移除错误的日期转整数逻辑:
<%= form_with(model: @user_job) do |form| %> <% if form.object.errors.any? %> <div style="color: red;"> <ul> <% form.object.errors.each do |error| %> <li><%= error.full_message %></li> <% end %> </ul> </div> <% end %> <div> <%= form.label :name, "Name:" %> <%= form.text_field :name %> </div> <div> <%= label_tag :dateuser, "Date:" %> <%= date_field_tag "dateuser", params[:dateuser] %> </div> <div> <%= label_tag :dateadd, "Date added:" %> <%= number_field_tag "dateadd", params[:dateadd] || 0, min: 0 %> </div> <div> <%= form.submit %> </div> <% end %>
效果验证
调整后输入示例参数即可生成符合预期的3条插入记录,所有字段都会被正确赋值,不会再出现空记录问题。
内容的提问来源于stack exchange,提问作者Ezio Auditore
相关产品推荐
相关产品推荐

