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

保存对象时如何合并URL参数与POST请求体参数?

问题原因与解决办法

为什么URL里的parent_id没被保存?

你跳转表单时URL里的parent_id是顶级参数(存在于params[:parent_id]),但你的block_params是从嵌套的params[:block]中提取参数的——表单提交时并没有把parent_id放到block的参数组里,所以你在permit里写的:parent_id根本取不到值,自然不会被保存到数据库。

另外你尝试手动合并参数的写法是错的:Block.new(block_params, parent_id: params[:parent_id]),ActiveRecord的new方法只接受一个属性哈希参数,传两个参数就会触发'params should be between 0...1'的错误。


两种正确的解决方式

方式一:在表单里添加隐藏字段

把URL里的parent_id作为隐藏字段嵌入表单,这样提交时它会被包含在block的参数组里,现有block_params就能直接获取到:

# 用form helper的写法(假设你的表单用f变量)
<%= f.hidden_field :parent_id, value: params[:parent_id] %>

# 或者用hidden_field_tag的写法
<%= hidden_field_tag 'block[parent_id]', params[:parent_id] %>

方式二:在create方法里合并参数

直接把顶级的parent_id合并到block_params的哈希中,再传给Block.new:

def create
  # 合并parent_id参数,注意是merge到同一个哈希里
  @block = Block.new(block_params.merge(parent_id: params[:parent_id]))

  if @block.save
    redirect_to @block
  else 
    render :new, status: :unprocessable_entity
  end
end

如果担心params[:parent_id]不存在导致问题,可以加个判断:

@block = Block.new(block_params)
@block.parent_id = params[:parent_id] if params[:parent_id].present?

内容的提问来源于stack exchange,提问作者nc14

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:55:25