保存对象时如何合并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
相关产品推荐
相关产品推荐

