ROR 3 условия в маршрутах.rb - PullRequest
1 голос
/ 17 апреля 2011

Есть ли способ указать условный оператор внутри rout.rb - я бы хотел, чтобы root_path зависел от того, вошел ли пользователь в систему или нет. возможно есть другие способы сделать это?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 17 апреля 2011

На самом деле я думаю, что вы можете использовать расширенные ограничения, это задокументировано здесь ...

Вы должны определить def matches?(request), чтобы проверить, вошел ли пользователь в систему, и использовать два маршрута, один с ограничением на вход, и один, когда нет. Хотя я не уверен, доступен ли сеанс при выполнении этого пользовательского ограничения.

Хотя я согласен со SpyrosP, было бы лучше сделать это в контроллере.

0 голосов
/ 24 апреля 2012

Я думаю, что предыдущие ответы (предполагающие, что before_filter в контроллере более уместен) немного пропускают сценарий использования OP. Есть все еще преимущества сделать это как условный маршрут / расширенное ограничение. Он не заменяет наличие фильтра «до» в контроллере для предотвращения несанкционированного прямого доступа. Но, например, наличие маршрута redirect_to root_path напрямую, например, профиль пользователя, когда он вошел в систему, или главная страница, если он не зарегистрирован, сохраняет флэш-сообщения, которые в противном случае были бы потеряны при втором перенаправлении в фильтре before. ИМХО более элегантно использовать расширенный подход с ограничениями (при условии, конечно, что сеанс действительно доступен при тестировании пользовательского ограничения). Не говоря уже, в этом случае, почему бы не сохранить дополнительное перенаправление (так как оно включает в себя целую другую транзакцию HTTP (S))?

UPDATE: Если вы используете Devise, эта статья описывает еще лучший подход. Просто реализовал это сам, и он прекрасно работает, и он чистый.

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

0 голосов
/ 17 апреля 2011

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

Вместо этого просто добавьте «before_filter: authenticate» (используя сеансы) на контроллерах, которые вы хотите защитить.Если кто-то попытается получить доступ к вашему контроллеру администратора, не будучи администратором, он будет перенаправлен для входа в систему или куда угодно.

...