Authlogic - как проверить, вышел ли пользователь из системы - PullRequest
0 голосов
/ 05 декабря 2011

Это мои настройки:

user.rb

  acts_as_authentic do |c|
    c.logged_in_timeout(1.minutes)
  end

user_session.rb

  def to_key
    new_record? ? nil : [ self.send(self.class.primary_key) ]
  end
  self.logout_on_timeout = true

application_controller.rb

  helper_method :current_user_session, :current_user

  private
    def current_user_session
      logger.debug "ApplicationController::current_user_session"
      return @current_user_session if defined?(@current_user_session)
      @current_user_session = UserSession.find
    end

    def current_user
      logger.debug "ApplicationController::current_user"
      return @current_user if defined?(@current_user)
      @current_user = current_user_session && current_user_session.user
    end

    def require_user
      logger.debug "ApplicationController::require_user"
      unless current_user
        #store_location
        flash[:warning] = "You must be logged in to access this page"
        #redirect_to new_user_session_url
        redirect_to root_url
        return false
      end
    end

    def require_no_user
      logger.debug "ApplicationController::require_no_user"
      if current_user
        #store_location
        flash[:warning] = "You must be logged out to access this page"
        redirect_to account_url
        return false
      end
    end

Но когда я загружу свою страницу, я получу ошибку

undefined method `logged_out?' for #<User:0x00000103ee8348>

Я пытаюсь прочитать официальную страницу GitHub в Authlogic, но до сих пор не знаю, чего мне не хватает ... Может кто-нибудь дать мне совет, как это исправить?

Большое спасибо заранее!

Ответы [ 2 ]

3 голосов
/ 05 января 2012

У меня была точно такая же проблема, и она сводилась к тому, что в моей модели User не было всех необходимых столбцов.

Моя исходная модель User (с db/schema.rb) быладовольно минималистично:

create_table "users", :force => true do |t|
    t.string   "username"
    t.string   "name"
    t.string   "crypted_password"
    t.string   "password_salt"
    t.string   "persistence_token"
    t.string   "perm",               :default => "employee"
end

Тем не менее, я добавил колонку t.datetime :last_requested_at к моей модели, а также несколько других, которые могут или не могут быть необходимы.Моя последняя пользовательская модель выглядит следующим образом:

create_table "users", :force => true do |t|
    t.string   "username"
    t.string   "name"
    t.string   "crypted_password"
    t.string   "password_salt"
    t.string   "persistence_token"
    t.string   "perm",               :default => "employee"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "login_count",        :default => 0,          :null => false
    t.integer  "failed_login_count", :default => 0,          :null => false
    t.datetime "last_request_at"
    t.datetime "current_login_at"
    t.datetime "last_login_at"
    t.string   "current_login_ip"
    t.string   "last_login_ip"
end

После добавления в другие столбцы я больше не получаю ошибку undefined method 'logged_out?'....

Удачи!

(ссылка/ Подробнее: http://www.michaelhamrah.com/blog/2009/05/authlogic-and-openid-on-rails/ - поиск на странице для logged_out?, объяснение было примерно на 3/4 пути вниз по сообщению.)

2 голосов
/ 05 декабря 2011

Если вы хотите узнать, вышел ли пользователь из системы, вы можете сделать:

if current_user_session
  ...

Это условие вернет true, если пользователь вошел в систему (сеанс существует), и false, если он вышел из системы (сеанс nil).

Что касается сообщения об ошибке, undefined method 'logged_out?' for #<User:0x00000103ee8348> означает, что вы не определили метод с именем logged_out?, поэтому он не знает, что вы имеете в виду.

Authlogic не определяет метод logged_out? для модели User, и ни у вас нет, так что вызывать нечего. Причина в том, что состояние «входа в систему» ​​или «выхода из системы» не имеет ничего общего с моделью User, а вместо этого является свойством того, имеет ли данный пользователь активный UserSession запись.

...