在 require 方法中免除属性

Exempt an attribute in require method

提问人:Nico Nisaw 提问时间:7/2/2021 最后编辑:Nico Nisaw 更新时间:7/2/2021 访问量:74

问:

我正在维护一个当前的 Web 应用程序(Ruby on Rails)。

我们的客户希望我将此属性添加到以下方法中:contacts_attributes: [:id, :stock_holding_status]

def meeting_log_params
params.require(:meeting_log).permit(
  :id,
  :stock_id,
  :ir_meeting_id,
  :start_at,
  :end_at,
  :kind,
  :meeting_type,
  :request_agent_company,
  :request_agent_name,
  :minute_taker,
  :subject,
  :content,
  :memo,
  :rating,
  :country,
  :city,
  :attachment_1,
  :remove_attachment_1,
  :attachment_2,
  :remove_attachment_2,
  :attachment_3,
  :remove_attachment_3,
  interviewers_attributes: [
    :id,
    :meeting_log_id,
    :resource_id,
    :resource_type,
    :_destroy
  ],
  speakers_attributes: [
    :id,
    :meeting_log_id,
    :resource_id,
    :resource_type,
    :_destroy
  ],
  meeting_log_contacts_attributes: [
    :stock_id,
    :company_name,
    :name,
  ],
  ir_guests_attributes: [
    :stock_id,
    :department,
    :title,
    :last_name,
    :first_name,
    :department_en,
    :title_en,
    :last_name_en,
    :first_name_en,
  ]
)
end

只是每次我在下面的此方法上使用添加的属性时,它都会返回我一个 422 错误(这意味着不可处理的实体)。

Contact.update_stock_holding_statuses(meeting_log_params[:contacts_attributes]) 

我认为这是因为在方法之前。你能告诉我如果我要在某些方法上使用添加的属性,如何豁免吗?required(:meeting_log)permitrequired(:meeting_log)

就像我想到的一样:

params.require(:meeting_log ? :meeting_log : nil).permit( <all_attributes>)

我尝试使用三元运算符来免除/禁用所需的部分,以便我使用特定方法上的添加属性并防止 422 干扰。但它没有用。contacts_attributes: [:id, :stock_holding_status]

请提出任何建议。

谢谢!

Ruby-on-Rails Ruby 方法

评论


答:

1赞 Joel Blum 7/2/2021 #1

简单来说怎么样

permitted_attributes = [:id,
  :stock_id,
  :ir_meeting_id,
  :start_at,
  :end_at,
  :kind,
  ...
]

def meeting_log_params 
  meeting_log ? params.require(:meeting_log).permit(permitted_params) : params.permit(:permitted_params)
1赞 Nik 7/2/2021 #2

据我所知,如果输入参数不匹配,那么你会得到代码 400(不是 422)。 代码 422 很可能与update_stock_holding_statuses方法中的模型验证有关。require.permit

评论

0赞 Nico Nisaw 7/2/2021
实际上,有一个单独的方法,其中包含客户希望我们添加的输入参数。 def contact_params params.permit( contacts_attributes: [ :id, :stock_holding_status, ] ) end 此方法有效,不会返回 422 错误。只是我们的客户希望将所有属性/参数放在一个方法中。那么,通过修改模型的验证来使其工作吗?
1赞 Nik 7/2/2021
如果您计划通过meeting_log_params方法的参数创建/更新联系人,则需要为 MeetingLog 模型添加“accepts_nested_attributes_for :contacts”(更多信息请在此处 api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/...)
1赞 Lam Phan 7/5/2021
如果输入参数不匹配,则会引发错误require.permitUnpermittedParameters