Rails 5 给定三类模型关联,Assignment嵌套表单配置是否正确?
配置问题排查结果
你的嵌套表单配置存在以下明确错误,不需要额外提供volunteer_events和volunteer_shift控制器代码即可排查修复:
- 模型层错误:
Assignment模型中重复定义了attr_accessor :volunteer_shift,会覆盖ActiveRecord自带的belongs_to :volunteer_shift关联的读写逻辑,直接删除该行即可。 - 控制器初始化错误:
new方法中belongs_to关联的构建写法错误,你当前用的是has_many关联的build语法,需要将@assignment.volunteer_shift.build改为@assignment.build_volunteer_shift。 - 视图参数传递错误:嵌套表单的下拉框使用了全局
select_tag,没有绑定嵌套表单builder对象,导致提交的参数不会被包裹在volunteer_shift_attributes中无法被正确解析。需要将三个下拉框的写法改为对应builder的select方法:<!-- 志愿任务类型下拉修改为 --> <%= vs.select :volunteer_task_type_id, options_from_collection_for_select([VolunteerTaskType.new(:description => ""), VolunteerTaskType.instantiables.effective_on(Date.today)].flatten, "id", "description") %> <!-- roster下拉修改为 --> <%= vs.select :roster_id, options_from_collection_for_select([Roster.new(:name => ""), Roster.all].flatten, "id", "name") %> <!-- 项目下拉修改为 --> <%= vs.select :program_id, options_from_collection_for_select([Program.new(:name => ""), Program.where(:volunteer => true)].flatten, "id", "name")%> - 必填字段缺失问题:
VolunteerShift模型强制校验start_time、end_time必填,但当前表单没有这两个字段的输入项,也没有默认赋值逻辑,提交时会触发校验失败。你需要要么在表单中补充这两个字段的输入,要么在模型/控制器层增加默认值赋值逻辑,同时要在assignment_params的volunteer_shift_attributes列表中补充这两个字段的白名单配置。
内容的提问来源于stack exchange,提问作者thefonso
相关产品推荐
相关产品推荐

