2011-11-17 52 views
2

下面是我在做什么:为什么x = params.dup不工作,但x = @ model.dup工作?

  1. 更新记录并保存其原始值
  2. 后来与之比较的原始值记录的值,以查看在一块发生了什么变化
  3. 马克这些变化纯文本

然而,我遇到意想不到的事情在#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 

问题:

  1. 为什么“duplicate_params = params.dup“不工作,而”old_hardware = @ hardware.dup“工作?
  2. 这是非典型的情况吗?我只在复制params和@models时遇到过这种情况,而且我的RoR经验其余部分似乎并不一致。

回答

0

在更新之前插入字符串,更改值,然后将带有先前插值的旧字符串前置到包含新值的字符串的前面。

这就是我期望会发生的 - 第一个字符串中的旧值在更新后不会被重新插值。

编辑都平地图正常工作:

> 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"} 
+0

我不是被今天太长时间看代码或你错过了帖子的目的 - 或者是两者兼而有之。如果原始版本的test_text = A A B,那么第二个结果也应该是A A B,而不是B A B.即使转储到日志文件,结果也是一样的,所以即使没有插值,为什么RoR在此显示此行为?这仍然没有回答为什么@ hardware.dup工作,但params.dup没有。 – Pope

+0

@Pope为什么第一个代码输出AAB?你把它更新到'10'。 'old_hardware'引用'@ hardware'的相同实例。 –

+0

哎呀。所以1)在这种情况下应该如何复制数据? 2.)为什么.dup不适用于params? – Pope

相关问题