如何在 permit + Rails 中合并嵌套属性

问题描述 投票:0回答:5
params.require(:task).permit(:summary, comments_attributes: [:id, :content])

我想在comments_attributes中添加user_idproject_id

user_id    = current_user.id
project_id = project.id

我试过下面但没有工作

params.require(:task).permit(:summary, comments_attributes: [:id, :content]).merge(user_id: current_user.id, comments_attributes: [user_id: current_user.id, project_id: project.id])

请帮帮我,我该怎么做?

ruby-on-rails ruby-on-rails-5
5个回答
3
投票

虽然是个老问题,恕我直言,正确答案是这个->

在 Rails 5 中,您应该使用

reverse_merge
而不是 .to_h.deep_merge

params.require(:task).permit(:summary, comments_attributes: [:id, :content]).reverse_merge(user_id: current_user.id, comments_attributes: [user_id: current_user.id, project_id: project.id])

1
投票

你将不得不使用deep_merge

params.require(:task).permit(:summary, comments_attributes: [:id, :content]).deep_merge(user_id: current_user.id, comments_attributes: [user_id: current_user.id, project_id: project.id])

1
投票

首先将允许的参数转换为散列,然后深度合并散列:

params.require(:task).permit(
    :summary,
    comments_attributes: [
        :id,
        :content
    ]
).to_h.deep_merge(
    user_id: current_user.id,
    comments_attributes: [
        user_id: current_user.id,
        project_id: project.id
    ]
)

0
投票
 params[:task][:comments_attributes].merge!({user_id: current_user.id, project_id: project.id})

0
投票

我无法让 current top answer 工作。

reverse_merge
本身似乎不会迭代调用
reverse_merge
comments_attributes
的嵌套
ActionController::Parameters
版本。相反,我需要做这样的事情:

_params = params.require(:task).permit(:summary, comments_attributes: [:id, :content])
_params.reverse_merge!(user_id: current_user.id)
_params[:comments_attributes].each do |key, value|
  _params[:comments_attributes][key] = value.reverse_merge(user_id: current_user.id, project_id: project.id)
end
_params

很高兴听到是否有更直接的答案!

© www.soinside.com 2019 - 2024. All rights reserved.