Ruby on rails 为什么x=params.dup不起作用,但x=@model.dup起作用?
以下是我正在做的:Ruby on rails 为什么x=params.dup不起作用,但x=@model.dup起作用?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,以下是我正在做的: 更新记录并存储其原始值 稍后,将记录的值与原始值进行比较,以查看发生了什么变化 在一段纯文本中标记这些更改 然而,我在#1遇到了意想不到的事情 人们会期望它是: 5 - BV 5 - BSUB 10 5 - AV 5 - ASBU 10 5 - BV 5 - BSUB 10 5 - AV 5 - ASBU 10 看起来,当params或params的子集用作新变量的值时,新变量只是引用与params相同的确切地址/值,而不是创建值的新实例。如果在更新_属性行之前执行类似于
5 - BV 5 - BSUB 10
5 - AV 5 - ASBU 10
5 - BV 5 - BSUB 10
5 - AV 5 - ASBU 10
看起来,当params或params的子集用作新变量的值时,新变量只是引用与params相同的确切地址/值,而不是创建值的新实例。如果在更新_属性行之前执行类似于duplicate_params=params.dup的操作,然后输出duplicate_params的不同属性,则会发生相同的情况
def update
@hardware = Hardware.find(params[:id])
old_params = params[:hardware].dup
old_hardware_status_id = @hardware.status_id
test_text = "#{old_params[:status_id]} - BV #{old_hardware_status_id} - BSUB #{params[:hardware][:status_id]}"
respond_to do |format|
if @hardware.update_attributes(params[:hardware])
test_text = "#{test_text}<p>#{old_params[:status_id]} - AV #{old_hardware_status_id} - ASUB #{params[:hardware][:status_id]}"
format.html {
render :text => test_text
#redirect_to(@hardware, :notice => "Hardware was successfully updated.")
}
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @hardware.errors, :status => :unprocessable_entity }
end
end
end
人们会期望它是:
5 - BV 5 - BSUB 10
5 - AV 5 - ASBU 10
5 - BV 5 - BSUB 10
5 - AV 5 - ASBU 10
换句话说,一旦运行了update_属性,任何基于原始参数的值(例如旧的_硬件或重复的_参数)都会被更新
但是,如果在原始实例中执行:old_hardware=@hardware.dup,则不会发生这种情况,这将为您提供:
5 - BV 5 - BSUB 10
5 - AV 5 - ASBU 10
问题:
在更新之前对字符串进行插值,更改值,然后在包含新值的字符串前面加上以前插值的旧字符串 这就是我希望发生的事情——第一个字符串中的旧值在更新后不会重新插值 编辑复制贴图效果良好:
> foo = { hardware: { id: 10, foo: "bar" } }
=> {:hardware=>{:id=>10, :foo=>"bar"}}
> old = foo[:hardware].dup
=> {:id=>10, :foo=>"bar"}
> foo[:hardware]
=> {:id=>10, :foo=>"bar"}
> foo[:hardware][:foo] = "baz"
=> "baz"
> foo[:hardware]
=> {:id=>10, :foo=>"baz"}
> old
=> {:id=>10, :foo=>"bar"}
在更新之前对字符串进行插值,更改值,然后在包含新值的字符串前面加上以前插值的旧字符串 这就是我希望发生的事情——第一个字符串中的旧值在更新后不会重新插值 编辑复制贴图效果良好:
> foo = { hardware: { id: 10, foo: "bar" } }
=> {:hardware=>{:id=>10, :foo=>"bar"}}
> old = foo[:hardware].dup
=> {:id=>10, :foo=>"bar"}
> foo[:hardware]
=> {:id=>10, :foo=>"bar"}
> foo[:hardware][:foo] = "baz"
=> "baz"
> foo[:hardware]
=> {:id=>10, :foo=>"baz"}
> old
=> {:id=>10, :foo=>"bar"}
我今天要么看代码看得太久,要么你错过了这篇文章的意图——或者两者兼而有之。如果test_text的原始版本=A A B,那么第二个结果也应该是A B,而不是B A B。即使转储到日志文件,结果也是相同的,所以即使没有插值,RoR为什么在这里显示这种行为?这仍然不能回答为什么@hardware.dup有效,但params.dup无效。@Pope为什么第一个代码应该输出AAB?您将其更新为
10
old_hardware
引用了相同的实例@hardware
does.Gotcha。因此,1.)在这种情况下,如何复制数据?2.)为什么.dup对params不起作用?@Pope第二个案例发生了什么?我更新了帖子,让它更清楚一点。这两个示例(old_hardware=@hardware或old_params=params.dup)都给出了相同的输出:5 10/10 5 10。执行hardware.dup会得到5 5 10/5 10,这是我期望的行为,也是所需的结果集。我今天看代码的时间太长了,或者你错过了本文的意图,或者两者都没有。如果test_text的原始版本=A A B,那么第二个结果也应该是A B,而不是B A B。即使转储到日志文件,结果也是相同的,所以即使没有插值,RoR为什么在这里显示这种行为?这仍然不能回答为什么@hardware.dup有效,但params.dup无效。@Pope为什么第一个代码应该输出AAB?您将其更新为10
old_hardware
引用了相同的实例@hardware
does.Gotcha。因此,1.)在这种情况下,如何复制数据?2.)为什么.dup对params不起作用?@Pope第二个案例发生了什么?我更新了帖子,让它更清楚一点。这两个示例(old_hardware=@hardware或old_params=params.dup)都给出了相同的输出:5 10/10 5 10。Doing hardware.dup给出5 10/5 10,这是我期望的行为,也是所需的结果集。