2010-04-29 41 views
0

想這是我的用戶控制器: -在rails中的會話問題?

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將是:---

現在

,當他在更新點擊,他將得到的輸出是這樣的: -

rai Show page Update 

但是這不應該發生的原因

首先當是在做準備,其中值從DB fecthced行動,其mohit。然後他被重定向以顯示即將會話中的值。即莫希特

現在當上他被重定向時從會話值存儲到用戶實例和用戶實例的名稱屬性更新更新用戶點擊已修改爲。最後重定向到顯示頁面。

現在在這個頁面當用戶的名字顯示其顯示rai ..多數民衆贊成在問題爲什麼?? 原因會話應存儲在同一莫希特值的原因,我們havnt取得了會話中的任何改變..

回答

2

當你在做

@user = session[:user] 

@user variabe分配對象的引用session[:user],不是它的拷貝。 因此當你修改@user時,session[:user]也被修改,因爲它們本質上是同一個對象。

+0

雅那發生了什麼。我能理解,但我無法理解爲什麼會發生.. !!! – 2010-04-29 09:30:50

+0

在ruby變量中保存引用,而不是值。所以當你分配時,你正在複製引用。 http://ruby-doc.org/docs/Newcomers/ruby.html#objects – Voyta 2010-04-29 10:33:24

0

我不確定,但我認爲這是與哈希和類的東西,關於複製它們。所以,當你這樣做:

@user = session[:user] 

你最好不要讓對象的副本,但它是likre在C基準++,既@usersession[:user]被reffering同一個對象,所以當你修改一個,你同時獲得修改。從控制檯

例子:

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' 
+0

雅這就是發生了什麼..我可以理解,但我無法理解爲什麼發生這種情況.. !!! – 2010-04-29 09:29:40

+0

@piemesons:當您分配'@user = session [:user]'時,您不復制用戶對象。您正在將「指針」複製到該對象。舉例來說,如果你有一個朋友叫「鮑勃」,你給他100美元,那麼他有100美元:)。現在,如果你稱他爲「Foo」(它是同一個人,但名字不同),你又給他100美元,他現在有200美元,而不是100美元。它與會話對象發生的事情非常相似。 – klew 2010-04-29 09:58:27

+0

在這個控制檯的例子中,你可以調用'a [:user] .object_id'和'b.object_id',它是一樣的。這意味着'a [:user]'和'b'指的是同一個對象。 – klew 2010-04-29 10:00:50