gpt4 book ai didi

ruby-on-rails - Rails 参数中复制和克隆的明显问题

转载 作者:太空宇宙 更新时间:2023-11-03 17:45:05 29 4
gpt4 key购买 nike

我在 Rails Controller 中。我尝试采用一些 params 并更改一些数据来更新模型,但我也想保持原始 params 不变。

合乎逻辑的方法是使用 clonedup 但无论我尝试什么,它都会失败并更改原始哈希。

# Original product_params which is set as params.require(:product)
{"name"=>"Product 2",
"brand"=>"Brand 2",
"desc"=>"Placeat a sunt eos incidunt temporibus.\r\n\r\nReprehenderit repudiandae amet quibusdam dolorem et. Itaque commodi at.",
"hs_code"=>"12212121",
"options_attributes"=>
{"0"=>{"name"=>"hkjlVariation 4", "suboptions_attributes"=>{"0"=>{"name"=>"Chkjlhoice 0", "id"=>"582209026b710eded24ecd12"}}, "id"=>"582209026b710eded24ecd13"},
"1"=>
{"name"=>"hhVhariation h5kkk",
"suboptions_attributes"=>{"0"=>{"name"=>"Choice 0kh", "id"=>"582209026b710eded24ecd14"}, "1"=>{"name"=>"hkjChoice 1", "id"=>"582209026b710eded24ecd16"}, "2"=>{"name"=>"kkk"}},
"id"=>"582209026b710eded24ecd15"},
"2"=>{"name"=>"lh", "suboptions_attributes"=>{"0"=>{"name"=>"klhj"}}}}}

# Method to change the `suboptions_attributes` to `nil`
def product_params_without_suboptions
copy = product_params.dup
copy.tap do |product_param|
product_param[:options_attributes].each do |key, option_attribute|
unless option_attribute[:suboptions_attributes].nil?
option_attribute[:suboptions_attributes] = nil
end
end
end
end

# We define product_params
def product_params
params.require(:product).permit!
end

product_params_without_suboptions 的结果是正确的。它将所有 option_attribute 设置为 nil 但是当我尝试调用 paramsproduct_params 时它也在那里发生了变化。 为什么 dup 不能在这里工作?

最佳答案

工作解决方案

经过一些调查,我意识到 params 及其亲属是一个 ActionController::Parameters 类,而不是一个简单的哈希输出,用 require 操作它是合乎逻辑的,except 等。我首先认为它会完全像哈希一样,但事实并非如此。

在其上执行clonedupdeep_dup 只会复制类,并且由于 rails 的魔力,可以更改其中的任何内容复制将导致全局变化。我不知道这种行为的确切原因,但我猜有一些类变量/单例模式正在发生。

我找到的最简单的解决方案是通过 to_h 将其转换为散列,这样就解决了这个问题。您可以执行 params_hash = params.to_h 然后操作散列,它不会对原始 params 对象产生任何影响。

关于ruby-on-rails - Rails 参数中复制和克隆的明显问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40510232/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com