为何创建表单时f.select选项值无法保存,编辑时却正常?
问题诊断与解决方案
嘿,我一眼就揪出问题所在了!你在create方法里写的@event.category_id = params[:category_id]这行代码是错的,这正是首次创建时分类ID无法保存的元凶。
为什么会出现这个问题?
你的表单里用form.select(:category_id)生成的HTML元素,它的name属性会是event[category_id]——也就是说,选择框的值会被嵌套在params[:event]这个哈希里,而不是直接出现在params的根层级。你现在直接取params[:category_id],根本拿不到任何值,所以首次创建时@event的category_id其实是空的,自然保存后看不到这个值。
而编辑的时候,你应该是依赖了正确的强参数处理(event_params),所以重新选择后能正常保存。
具体修改步骤
删除冗余的手动赋值代码
把create方法里的这行删掉:@event.category_id = params[:category_id]确保强参数包含
category_id
检查你的event_params方法,一定要把category_id加到允许的参数列表里,比如:def event_params params.require(:event).permit(:name, :description, :start_time, :category_id) # 这里可以补充你需要的其他字段 end表单代码无需修改
你现有的表单代码是正确的:<%= form.select(:category_id, options_for_select(@categories, :selected => form.object.category_id), {}, {required: 'true', class: 'form-control form-control-lg custom-select'}) %>options_for_select用form.object.category_id设置默认选中值的写法没问题,不用调整。
做完这两步,你再试一次首次创建表单,分类ID应该就能正常保存并显示在详情页了,不用再重复编辑的步骤啦!
内容的提问来源于stack exchange,提问作者SMIIILE
相关产品推荐
相关产品推荐

