Самый чистый способ сделать это с помощью функции before_filter. Это команда в верхней части вашего контроллера, которая вызывается перед любым действием в этом контроллере (которое вы хотите). Обычно вам нужно выполнить одну и ту же проверку для более чем одного действия в контроллере, поэтому нет смысла вставлять эту проверку непосредственно в каждое действие.
Допустим, у вас есть контроллер комментариев, и вы хотите, чтобы действия по редактированию, обновлению и уничтожению выполнялись только тем, что мог выполнить только авторизованный пользователь. Это очень распространено. Давайте посмотрим на пример. Для краткости я не буду описывать все действия контроллера, только уникальные вещи:
class CommentsController < ApplicationController
before_filter :user_logged_in?, :only => [:edit, :update, :destroy]
# all your actions would go here - index, show, etc #
protected
def user_logged_in?
redirect_to dashboard_path unless current_user
end
end
В приведенном выше примере метод user_logged_in?
будет запущен до выполнения действий редактирования, обновления или уничтожения. Если рендеринг или перенаправление вызваны внутри этого метода, rails остановится и никогда не выполнит действие. Вот почему это называется фильтром. Вместо этого выполнит запрос рендеринга или перенаправления.
Метод current_user
является распространенным помощником, который предоставляет большинство плагинов для аутентификации пользователей, что обычно равно нулю, если текущего пользователя нет. Таким образом, наш метод фильтрации говорит rails перенаправить на определенный путь, , если пользователь не вошел в систему.
Это де-факто способ справиться с чем-то подобным. Очень хороший вопрос.