rails中的会话问题?

时间:2010-04-29 08:52:41

标签: ruby-on-rails session

假设这是我的用户控制器: -

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值因为我们在会话中做了任何改变。

2 个答案:

答案 0 :(得分:2)

当你做的时候

@user = session[:user]

@user变量被赋予对象session[:user]的引用,而不是它的副本。 因此,当您修改@user时,session[:user]也会被修改,因为它们本质上是同一个对象。

答案 1 :(得分:0)

我不确定,但我认为它是哈希和类以及复制它们的东西。所以当你这样做时:

@user = session[:user]

你没有制作一个对象的副本,但它在C ++中是一个很有用的参考,@usersession[: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'