You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:15:02