为什么这两个相似的代码产生不同的结果

时间:2016-02-27 20:29:53

标签: ruby-on-rails

def page_rewrite2
    temp = Db1.find(params[:id])
    temp.content = params[:submit_recontent]
    temp.save
    redirect_to "/contrl1/page_main"
end

此代码效果很好。 内容已更改并保存。

def page_rewrite2
    Db1.find(params[:id]).content = params[:submit_recontent]
    Db1.find(params[:id]).save
    redirect_to "/contrl1/page_main"
end

我认为这段代码也必须运作良好。 但是,此代码不能很好地工作。 为什么这两个相似的代码会产生不同的结果?

2 个答案:

答案 0 :(得分:0)

原因是Db1.find方法总是返回新的实例od Db1类。两个实例可能绑定到同一个db记录,但是在编程级别它们是不同的对象。它几乎与:

相同
class A
  attr_accessor :a
end

obj = A.new
obj.a = 4
obj.a #=> 4

A.new.a #=> nil, not 4

答案 1 :(得分:0)

在第二种情况下

def page_rewrite2
    Db1.find(params[:id]).content = params[:submit_recontent]
    Db1.find(params[:id]).save
    redirect_to "/contrl1/page_main"
end

您首先加载记录,为其内容分配一些新值。 之后您再次加载记录并保存。这个新加载的记录不知道您在上一步中更新了内容。这就是为什么它不能像你想象的那样工作。

通过将加载的记录分配给变量,就像您在第一个示例中所做的那样,该记录知道其内容已更新,因此它会保存该信息。