Rails使用check_box_tag触发stringify_keys错误如何解决
问题解决办法
报错直接原因
check_box_tag参数使用错误,Rails中该方法的标准语法为:
check_box_tag(name, value = "1", checked = false, options = {})
你代码中写的<%= check_box_tag "id[]", iteam.id, "status[]", iteam.status %>里第四个参数iteam.status是字符串类型,而方法要求第四个参数为配置项哈希,Rails内部会自动对该参数调用stringify_keys方法,字符串没有对应方法,直接触发本次报错。
修复步骤
1. 修正视图层代码
你当前的需求是选中对应条目后批量更新状态,checkbox只需要标记被选中的条目ID即可,不需要传递status参数,将checkbox行修改为:
<!-- 如果需要默认勾选状态为DONE的条目,加第三个参数即可 --> <%= check_box_tag "iteam_ids[]", iteam.id, iteam.status == 'DONE' %>
如果需要让用户自主选择要修改的目标状态,可以在提交按钮前加状态选择下拉框:
<%= select_tag :target_status, options_for_select([['已完成', 'DONE'], ['进行中', 'progress']]) %>
2. 修正控制器层代码
你原有控制器逻辑存在多处问题:批量ID数组不能直接用find查询单条记录、update_attribute是单条记录方法不支持批量操作、没有获取目标状态参数,修改后代码如下:
def update_me # 校验是否选中条目 if params[:iteam_ids].blank? flash[:alert] = "请先选择要修改的条目" redirect_to iteams_path and return end # 批量更新选中条目状态 Iteam.where(id: params[:iteam_ids]).update_all(status: params[:target_status]) flash[:notice] = "状态更新成功" redirect_to iteams_path end
如果不需要用户自主选择状态,提交后直接将选中条目设为DONE,直接把params[:target_status]替换为固定值'DONE'即可。
内容的提问来源于stack exchange,提问作者Kais
相关产品推荐
相关产品推荐

