Похоже, вы смешиваете здесь проблемы. Валидации не предназначены для контроля доступа. Действительные пользователи могут иметь или не иметь доступ к определенным частям приложения, недопустимые пользователи никогда не должны создаваться в первую очередь. Недействительные пользователи существуют, но только во время рендеринга формы с сообщениями об ошибках. Они никогда не сохраняются.
Validations
Самый простой контроллер лесов в рельсах покажет вам, как должен выглядеть контроллер.
# Example of registration form
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(params[:user])
if @user.save
redirect_to root_url, notice: 'Welcome!'
else
render :new
end
end
end
В приведенном выше коде обратите внимание на строку с надписью render :new
. Вот что происходит, когда @user
не может быть сохранено. Почему не мог? Потому что проверки не пройдены. Как вы знаете, какие проверки не удалось? Глядя на @user.errors
, который заполняется для вас. Вот почему мы делаем, а не перенаправляем. Как только вы перенаправите, массив @user.errors
больше не будет существовать. Так что, на ваш взгляд, вы просто должны пройтись по @user.errors.full_messages
и красиво отобразить их.
Права доступа
Разрешения - это совсем другая история. Если ваши пользователи могут быть, скажем, администраторами, то в вашей таблице пользователей, вероятно, есть логический столбец с именем admin. Это автоматически даст вам метод @user.admin?
. В ваших контроллерах и представлениях у вас будет current_user
в зависимости от сеанса, поэтому вы можете использовать current_user.admin?
. Многие люди делают следующее в своем ApplicationController.
class ApplicationController < ActionController::Base
# ...
helper_method :admin?
def admin?
current_user.present? && current_user.admin?
end
end
Это даст всем вашим контроллерам и представлениям метод, называемый admin?
, который вы можете использовать, чтобы определить, может ли пользователь получить доступ к чему-либо. Более сложные разрешения требуют использования ролей. Есть хорошая библиотека под названием CanCan от Райана Бейтса, которая может помочь с этим.