2010-10-29 1 views
1

Я работаю с Ruby on Rails 2.3.8, и я хочу, чтобы пользователи входили в систему, прежде чем приобретать какой-либо контент с веб-сайта.Не удается отфильтровать вход в систему пользователей на application_controller

Я написал следующее в application_controller

before_filter :login_required 

При запуске приложения, я получаю сообщение об ошибке в браузере (даже не из самого приложения), говоря, что не удалось перенаправить страницу. И я вижу в URL-адресе, который говорит http://localhost:3000/session/new, но это не сработает.

Затем я попытался поместить этот фильтр в другой контроллер, например, в dashboard_controller, который является домашней страницей, и он работал нормально (но он работает только для этого контроллера, и я хочу, чтобы он все приложение).

Затем я начал думать, и я на самом деле думаю, что фильтр выполняется перед входом в один из этих двух линий создаются в файле маршрутов:

map.login '/login', :controller => 'sessions', :action => 'new' 
map.signup '/signup', :controller => 'users', :action => 'new' 

Любая помощь будет оценена.

+0

Одна проблема заключается в том, что before_filter - это один метод, а не два. – TreyE

+0

Хорошо, мое плохое. Я написал это неправильно в сообщении, но не в коде, так что это не проблема. –

ответ

3

Я предполагаю, что вы перенаправляете, не исключая действие контроллера, с которого вы не хотите перенаправлять. То есть, ваш фильтр перед запуском запускается с страницы входа.

Если это так, пропустите before_filter в сеансе контроллера

skip_before_filter :login_required, :only => [:login, :create] 
+0

Это сработало! Теперь я понимаю проблему. Это было похоже на круговое перенаправление, поэтому браузер не знал, что с ним делать. Я закончил писать следующее на session_controller: skip_before_filter: login_required –

+0

yep, бесконечные перенаправления, браузеры им не нравятся :) – tybro0103

0

Вы не хотите, чтобы фильтровать каждый запрос, только те, которые требуют, вошедшего в систему пользователя. Поэтому поместите before_filter в каждый контроллер, где требуется, а не в ApplicationController. Да, это означает, что будет некоторое дублирование (О, ужас!), Но цель кода будет более ясной.

+0

Я новичок в rails, но не мог бы вы создать еще один класс базового контроллера, который наследует от ApplicationController, что имеет код before_filter, а затем наследует от нового базового контроллера для тех областей сайта, для которых требуется логин? Вы могли бы назвать это SecuredController или что-то в этом роде. Будет ли это работать? – someoneinomaha

+0

Да, вы можете создать свои собственные «полиморфные» классы контроллеров. На практике я не думаю, что это делается очень часто, потому что действия, как правило, достаточно различны, что нет большой победы. Но YMMV. В случае с OP это всего лишь одна строка кода, которая дублируется - вам действительно нужен другой класс, только для DRY? – zetetic

+0

Дополнительная информация о полиморфных контроллерах для заинтересованных лиц: http://www.pathf.com/blogs/2008/07/drying-up-rails-controllers-polymorphic-and-super-controllers/ – zetetic

Смежные вопросы