2010-04-29 2 views
0

Пусть это мой контроллер пользователи: -Вопрос заседания в рельсах?

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 

о/р будет: ---

Mohit Show page Update // supposing user table has values mohit as name 

Теперь, когда он нажмите на обновление, он получит в качестве вывода, как это: -

rai Show page Update 

Но это не должно произойти причиной

во-первых, когда находятся в подготовке действий, где значение fecthced из БД и его mohit. и затем он перенаправляется, чтобы показать, что это означает, что значения из сеанса. т.е. Мохит

Теперь, когда пользователь нажимает на обновление, он перенаправляется на обновление, когда значение из сеанса сохраняется в экземпляр пользователя и имя атрибута этого экземпляра пользователя был изменен раи. и, наконец, перенаправлен на страницу.

Теперь на этой странице, когда отображается имя пользователя, отображается его rai .. thats THE QUESTION why ?? причина сеанса должны хранить то же значение Мохит причину мы havnt сделали какие-либо изменения в сессии ..

ответ

2

Когда вы делаете

@user = session[:user] 

@user variabe присваивается ссылка на объект session[:user], а не копию. Так что, когда вы изменяете @user, session[:user] также изменяется, поскольку они являются по сути одним и тем же объектом.

+0

Я тот Что происходит .. я могу понять, но я не могу понять, почему это происходит .. !!! –

+0

В рубиновых переменных хранятся ссылки, а не значения. Поэтому, когда вы назначаете, вы копируете ссылки. http://ruby-doc.org/docs/Newcomers/ruby.html#objects – Voyta

0

Я не уверен, но я думаю, что это что-то с хешами и классами и о их копировании. Так что, когда вы делаете:

@user = session[:user] 

Вы не делаете копию объекта, но это что-то likre ссылки на 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' 
+0

Ya thats случается .. я могу понять, но я не могу понять, почему это происходит .. !!! –

+0

@piemesons: когда вы назначаете '@user = session [: user]' вы не копируете объект пользователя. Вы копируете «указатель» на этот объект. Так, например, если у вас есть друг под названием «Боб», и вы даете ему 100 долларов, то у него 100 $ :).Теперь, если вы называете его «Foo» (это тот же человек, но другое имя), и вы даете ему еще 100 долларов, у него теперь 200 $, а не 100 $. Это очень похоже на то, что происходит с вашим объектом сеанса. – klew

+0

В этом примере консоли вы можете вызвать 'a [: user] .object_id' и' b.object_id', и это то же самое. Это означает, что и 'a [: user]', и 'b' относятся к одному и тому же объекту. – klew

Смежные вопросы