Элегантно избегая ошибок - PullRequest
0 голосов
/ 15 июля 2010

В моем приложении есть такие выражения, как @user = User.find(current_user.id).

Иногда пользователь может войти с переменной nil (например, новый пользователь, для которого current_user равен nil).

IЯ уверен, что глупый способ сделать это будет разбросать, если заявления везде, как ...

if current_user.exists?
  @user = User.find(current_user.id)
else
  redirect_to root_url
  ---*or*---
  @user = "new"   # for use with if/case statements later on
end

Какой элегантный способ справиться с этой путаницей?

Ответы [ 3 ]

0 голосов
/ 15 июля 2010

Чтобы получить ноль, когда нет текущего пользователя:

@user = current_user && User.find(current_user.id)

Чтобы получить «новый», когда нет текущего пользователя:

@user = current_user ? User.find(current_user.id) : 'new'

Ни один из них на самом деле не решает проблему, но теперь, по крайней мере, он находится на одной строке.Для более общего решения, возможно, вам следует удалить переменную current_user.

0 голосов
/ 15 июля 2010

@user = User.find(current_user.id) немного ненужно. Главным образом, поскольку current_user уже является объектом User, поэтому по крайней мере вы должны сделать @user = current_user, но я бы порекомендовал, чтобы, если это еще не сделано средой аутентификации, я добавил бы это к вашему контроллеру приложения:

helper_method :current_user

Это сделает объект current_user доступным для ваших представлений и сделает объект @user ненужным.

Для обработки перенаправлений у меня обычно это есть в контроллере приложения:

before_filter :require_login

def require_login
   current_user || redirect_to(root_url)
end

А потом в моих контроллерах, которые не хотят перенаправлять:

skip_before_filter :require_login

Что касается установки пользователя на новое, я бы не стал этого делать. Как правило, мои User объекты являются объектами пользователя. Я бы просто протестировал нового пользователя по if current_user, где nil current_user - это то же самое, что и установка его в 'new'.

Надеюсь, это поможет

0 голосов
/ 15 июля 2010

Предполагая, что используемый вами язык является объектно-ориентированным, я бы создал объект, который содержит текущий пользовательский контекст.По умолчанию вы можете использовать экземпляр CurrentUserContext для неизвестных пользователей, у которых очень ограниченный доступ.

Когда пользователи входят в систему, вы можете загрузить всю информацию о пользователе и информацию о безопасности в новый экземпляр CurrentUserContext.

Этопросто грубая идея, но, возможно, это поможет.

edit: Таким образом, вам не нужно будет создавать все виды правил исключений безопасности ... Вы просто принимаете настройки безопасности текущего экземпляра контекста и всего приложенияповедение в соответствии с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...