Authlogic - current_user или @current_user?

пожалуйста, помогите мне кое-что понять. В примере Authlogic в UsersController он всегда используется @current_user, например:

def show
  @user = @current_user
end

(взято из http://github.com/binarylogic/authlogic_example/blob/master/app/controllers/users_controller.rb)

Это почему? В своих контроллерах я использую просто current_user вместо @current_user.

И кроме того - Authlogic отлично работает у меня, но я не вижу, чтобы магические столбцы заполнялись (например, last_login_at или last_login_ip). Должен ли я инициализировать их как-то специально, помимо добавления в миграцию?

UPD После некоторого расследования я обнаружил, что если есть только поля last_login_at и last_login_ip из «Волшебных полей», то они не будут заполнены. Если я добавлю полный набор магических полей, он будет работать отлично.

UPD2 Меня беспокоит, что касается current_user только UsersController: почему у него @current_user, а не current_user?


person Vitaly    schedule 26.04.2010    source источник
comment
проверьте, есть ли у вас attr_accessible в пользовательской модели. Если он у вас есть, вам нужно внести эти поля в белый список.   -  person Sohan    schedule 27.04.2010
comment
У меня нет атрибутов attr_accessible, только plays_as_authentic.   -  person Vitaly    schedule 27.04.2010
comment
о том, почему @current_user, а не current_user, спросите автора? Это очевидный изъян в примере. Это должен быть current_user, потому что @current_user не будет работать, если он не инициализирован.   -  person jigfox    schedule 06.05.2010


Ответы (3)


current_user - это обычно метод, определенный в app/controllers/application_controller.rb, который устанавливает переменную экземпляра @current_user, если она еще не определена - вот пример:

  def current_user_session
    return @current_user_session if defined?(@current_user_session)
    @current_user_session = UserSession.find
  end

  def current_user
    return @current_user if defined?(@current_user)
    @current_user = current_user_session && current_user_session.record
  end

Что касается «волшебных столбцов», они должны быть установлены Authlogic автоматически. Например, если ваш контроллер пользовательских сессий входит в систему как пользователь:

@user_session = UserSession.new(params[:user_session])
@user_session.save

Authlogic должен написать за вас атрибуты last_login_at и last_login_ip. Дополнительная информация в документации Authlogic в разделе Module: Authlogic :: Session :: MagicColumns

person zetetic    schedule 26.04.2010
comment
Да, current_user - это метод, определенный в ApplicationController. Это не отвечает на вопрос, почему UsersController использует @current_user. Что касается last_login_at и last_login_ip - есть ли какой-либо параметр, чтобы среда разработки не заполняла их? Я настроил их точно по примеру. - person Vitaly; 27.04.2010
comment
current_user - это вспомогательный метод, который отслеживает текущего пользователя, вошедшего в систему. @current_user - это переменная экземпляра, взаимодействующая с моделью. Они совершенно разные. - person Shripad Krishna; 27.04.2010
comment
Я понимаю разницу. Я не понимаю, как @current_user инициализируется в UsersController? - person Vitaly; 27.04.2010
comment
UsersController наследуется от ApplicationController, поэтому получает его методы. Когда вы вызываете current_user из UsersController (или UserSessionsController), вы вызываете метод, определенный в вашем application_controller.rb. Я бы проверил образец кода, который вы используете - он может быть неполным или устаревшим. Как предложил Йенс, вам следует вызывать current_user вместо использования переменной экземпляра, если вы не знаете, что @current_user устанавливается где-то еще в вашем коде. - person zetetic; 28.04.2010
comment
Я тоже так подумал и был удивлен, увидев в коде @current_user вместо current_user. Это не мой код, это официальный пример authlogic. - person Vitaly; 28.04.2010

Что касается last_login_at и last_login_ip, есть ли у вас в таблице поля current_login_at и current_login_ip? last_login_at и last_login_ip устанавливаются со значениями current_login_at и current_login_ip перед их сбросом.

person Cecile    schedule 20.05.2010
comment
Ах, в этом есть смысл. Я написал в UPD, что с полным набором магических полей все заработало. Теперь это имеет для меня смысл! Спасибо :) Надо было добавить это в документацию. - person Vitaly; 21.05.2010

Я думаю, что код из этого примера не совсем хороший.

Вы не должны использовать @current_user для установки переменной @user. Потому что это не сработает, если метод ApplicationController # current_user не будет вызван перед действием show UserController. По сути, они оба точно такие же после того, как current_user вызывается один раз.

Пользовательский контроллер должен выглядеть так

class UserController < ApplicationController
  def show
    @user = current_user
  end
end

Что касается Magic Columns, я понятия не имею, почему они вам не подходят.

person jigfox    schedule 26.04.2010
comment
Да, я так и думал. Однако приведенный выше код работает и является стандартным примером для authlogic. Это не мой код. - person Vitaly; 27.04.2010
comment
да, это есть в примере, но это плохой пример, он должен быть @user = current_user - person jigfox; 06.05.2010