下面是我在做什么:为什么x = params.dup不工作,但x = @ model.dup工作?
- 更新记录并保存其原始值
- 后来与之比较的原始值记录的值,以查看在一块发生了什么变化
- 马克这些变化纯文本
然而,我遇到意想不到的事情在#1
def update
@hardware = Hardware.find(params[:id])
old_hardware = @hardware
old_hardware_status_id = @hardware.status_id
test_text = "#{old_hardware[: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_hardware[: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
10 - AV 5 - ASUB 10
人们会想到它是:
5 - BV 5 - BSUB 10
5 - AV 5 - ASBU 10
它看起来当params中,则params的一个子集作为一个新的变量的值,新象变量只是引用与params相同的确切地址/值,而不是创建值的新实例。如果你这样做,会发生同样的事情duplicate_params = params.dup之前update_attributes方法行,然后输出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
10 - AV 5 - ASUB 10
人们会想到它是:
5 - BV 5 - BSUB 10
5 - AV 5 - ASBU 10
换句话说,一旦运行的update_attributes,在原有基础上PARAMS任何值,如old_hardware或duplicate_params,为u pdated。
但是,如果在原来的情况下,你这样做不会发生:old_hardware = @ hardware.dup,它给你:
5 - BV 5 - BSUB 10
5 - AV 5 - ASBU 10
问题:
- 为什么“duplicate_params = params.dup“不工作,而”old_hardware = @ hardware.dup“工作?
- 这是非典型的情况吗?我只在复制params和@models时遇到过这种情况,而且我的RoR经验其余部分似乎并不一致。
我不是被今天太长时间看代码或你错过了帖子的目的 - 或者是两者兼而有之。如果原始版本的test_text = A A B,那么第二个结果也应该是A A B,而不是B A B.即使转储到日志文件,结果也是一样的,所以即使没有插值,为什么RoR在此显示此行为?这仍然没有回答为什么@ hardware.dup工作,但params.dup没有。 – Pope
@Pope为什么第一个代码输出AAB?你把它更新到'10'。 'old_hardware'引用'@ hardware'的相同实例。 –
哎呀。所以1)在这种情况下应该如何复制数据? 2.)为什么.dup不适用于params? – Pope