У меня есть модель Пользователь
class User < ActiveRecord::Base
has_and_belongs_to_many :roles
attr_accessible :login, :email, :password, :password_confirmation ...
attr_accessible :role_ids, :active, :as => :super_admin
validates :email, :presence => true,
:format => {:with => /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i},
:uniqueness => {:case_sensitive => false},
:restricted_email_domain => true
...
end
и два отдельных пользовательских контроллера для внешнего интерфейса и внутреннего интерфейса. Первый очень тривиален и хорошо работает, второй ниже
class Admin::UsersController < Admin::BaseController
def create
@user = User.new
@user.assign_attributes(params[:user], :as => :super_admin)
if @user.save
...
end
def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user], :as => :super_admin)
...
end
end
Я использую специальный валидатор, который проверяет, ограничен ли почтовый домен пользователя
class RestrictedEmailDomainValidator < ActiveModel::EachValidator
def validate_each(record, attr_name, value)
if !value.include?("@") # this value is nil if I add ":as => :super_admin"
record.errors.add(attr_name, :invalid, options.merge(:value => value))
else
domain = value.split("@")[1]
record.errors.add(attr_name, :restricted_email_domain, options.merge(:value => value)) if ::RestrictedEmailDomain.where(:domain => domain).exists?
end
end
end
module ActiveModel::Validations::HelperMethods
def validates_restricted_email_domain(*attr_names)
validates_with RestrictedEmailDomainValidator, _merge_attributes(attr_names)
end
end
Действие обновления работает хорошо, но действие создания выдает ошибку You have a nil object when you didn't expect it!
в config/initializers/restricted_email_domain_validator.rb:3:in 'validate_each'
. Без :as => :super_admin
все в порядке, но, конечно, атрибуты role_ids
и active
не назначены.
Я могу присваивать значения вручную, но я думаю, что это не идеальное решение.