Как я могу вытащить User.role_id через модель UserSession - PullRequest
2 голосов
/ 31 июля 2011

У меня в приложении отлично работает authlogic, но я выполняю свои собственные роли (я новичок в рельсах и хотел учиться ...)

Итак, у меня есть модель User, модель Role и модель User Sessions. Пользователь actions_as_authenticated.

В моем application_controller

protect_from_forgery
helper_method :current_user, :is_admin, :is_group_coach, :is_group_leader
private

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

def is_admin
  current_user.role_id == 3
end

def is_group_coach
  current_user.role_id == 2
end

def is_group_leader
  current_user.role_id == 1
end

Тогда я делаю простой if is_admin в представлении ...

но он возвращает неопределенный метод `role_id 'для nil: NilClass

Я думаю, что это происходит из-за того, что current_user фактически запускается из модели UserSession, а не из User ... Как я могу изменить это для запуска в соответствии с ожиданиями?

1 Ответ

0 голосов
/ 01 августа 2011

Ваш current_user_session метод, вероятно, неполон в этом фрагменте кода, так как вы не можете вызвать find без параметров, поэтому я предполагаю, что есть защита от значения nilили где-то в этом роде, если пользователь не вошел в систему. И если есть возможность, чтобы пользователь не вошел в систему, ваши методы должны учитывать это и вызывать методы только для current_user, если он доступен.

Ваши методы должны быть такими:

def is_admin
  current_user && current_user.role_id == 3
end

def is_group_coach
  current_user && current_user.role_id == 2
end

def is_group_leader
  current_user && current_user.role_id == 1
end

Это предотвратит разрыв теста, если в данный момент на сайте нет пользователя.

...