Вопрос сессии в рельсах? - PullRequest
0 голосов
/ 29 апреля 2010

Предположим, это мой пользовательский контроллер: -

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

Но этого не должно произойти, потому что

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

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

Теперь на этой странице, когда отображается имя пользователя, отображается его rai .. вот ВОПРОС, почему ?? причина сеанса должна хранить то же самое значение mohit, потому что мы не сделали никаких изменений в сеансе ..

Ответы [ 2 ]

2 голосов
/ 29 апреля 2010

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

@user = session[:user]

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

0 голосов
/ 29 апреля 2010

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

@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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...