Rails 使用 accepts_nested_attributes_for 去 update 一对多的嵌套表,为什么 update 变成了 insert

Runable · 2019年03月15日 · 最后由 Runable 回复于 2019年03月18日 · 567 次阅读
def update
  @diary=Diary.find(params[:id])
  if @diary.update(update_diary_params)
    render_ok
  else
    render_err :update_error
  end
end
def update_diary_params
  params.require(:diary).permit(:date,:weather,:remark, :diary_pictures_attributes=> [:diary_picture,:clothing_picture,:id,:_destroy])
end
class Diary < ApplicationRecord
  has_many :diary_pictures,dependent: :destroy

  accepts_nested_attributes_for :diary_pictures,allow_destroy: true

end

class DiaryPicture < ApplicationRecord
  belongs_to :diary
  validates_presence_of :diary
end

共收到 13 条回复

为什么不是update是insert?

params自己输出一下

id 有传上来吗?

zj0713001 回复

参数可以获取到,但是update的时候变成了insert

Rei 回复

:diary_pictures_attributes=> [:diary_picture,:clothing_picture,:id,:_destroy],这里的:id可以获取到吗?

Rei 回复

有更新diary的内容,但是到了diary_picture就不是update了,变成了insert

在终端模拟一下 update 看模型设置和参数有没有问题。把 controller 过滤后的 params 打印出来看看合不合预期。

Runable 回复

update的action里 binding.pry打断点 然后输出params 贴出来~

是这个错误吗?

你这个里面的 id 并不是嵌套表单里面的 id,取到数据的时候自然找不到原有的数据去 update,所以每次都是进行 insert 操作

diary_pictures_attributes 数组项里没有 id。

可能是form没写好,用fields_for会自动帮你输出id field

<%= form.fields_for :dirary_pictures do |pic| %>
<% end %>

问题找到了,感谢大家,是id的问题,他找不到id就自己创建了

Runable 关闭了讨论 03月18日 17:48
Runable 重新开启了讨论 03月18日 17:49
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册