假设这是我的用户控制器: -
class UsersController < ApplicationController
def show
@user = session[:user]
end
def prepare
session[:user]= User.find(:first)
redirect_to :action => 'show'
end
def update
@user = session[:user]
@user.name = 'rai'
redirect_to :action => 'show'
end
end
查看show.html.erb
<%= @user.name %>
Show page
<%= link_to 'Update', :action=> 'update' %>
现在解释这个问题:--- 假设第一次用户使用
打开浏览器 http://localhost:3000/users/prepare
o / p将是:---
Mohit Show page Update // supposing user table has values mohit as name
现在当他点击更新时,他会得到如下输出: -
rai Show page Update
但这不应该发生原因
首先是准备行动,其中值是从db及其 mohit 中获取的。然后他被重定向显示即从会话中显示值。即 mohit
现在,当用户点击更新时,当会话中的值存储到用户实例并且该用户实例的名称属性已修改为 rai 时,他会被重定向到更新。最后重定向到显示页面。
现在在这个页面显示用户的名字时显示rai ..这就是问题为什么? 因为会话应该存储相同的mohit值因为我们在会话中做了任何改变。
答案 0 :(得分:2)
当你做的时候
@user = session[:user]
@user
变量被赋予对象session[:user]
的引用,而不是它的副本。
因此,当您修改@user
时,session[:user]
也会被修改,因为它们本质上是同一个对象。
答案 1 :(得分:0)
我不确定,但我认为它是哈希和类以及复制它们的东西。所以当你这样做时:
@user = session[:user]
你没有制作一个对象的副本,但它在C ++中是一个很有用的参考,@user
和session[:user]
都在同一个对象上,所以当你修改它时,你会得到两个修改。
来自控制台的示例:
a = {}
a[:user] = User.first
a[:user].firstname # => "Mohit"
b = a[:user]
b.firstname = 'rai'
a[:user].firstname # => 'rai'
a[:user] = User.first
a[:user].firstname # => 'Mohit'