Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么x=params.dup不起作用,但x=@model.dup起作用?_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

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相同的确切地址/值,而不是创建值的新实例。如果在更新_属性行之前执行类似于

以下是我正在做的:

  • 更新记录并存储其原始值
  • 稍后,将记录的值与原始值进行比较,以查看发生了什么变化
  • 在一段纯文本中标记这些更改
  • 然而,我在#1遇到了意想不到的事情

    人们会期望它是:

    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
    
    问题:

  • 为什么“duplicate_params=params.dup”不起作用而“old_hardware=@hardware.dup”起作用
  • 这是一种非典型的情况吗?我只在复制params和@models时遇到过这种情况,这似乎与我的RoR经验不一致

  • 在更新之前对字符串进行插值,更改值,然后在包含新值的字符串前面加上以前插值的旧字符串

    这就是我希望发生的事情——第一个字符串中的旧值在更新后不会重新插值

    编辑复制贴图效果良好:

    > 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,这是我期望的行为,也是所需的结果集。