Ruby on rails Rails属性可访问:as和自定义验证器
我有一个模型用户Ruby on rails Rails属性可访问:as和自定义验证器,ruby-on-rails,ruby-on-rails-3.1,customvalidator,attr-accessible,Ruby On Rails,Ruby On Rails 3.1,Customvalidator,Attr Accessible,我有一个模型用户 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
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用户:超级管理员
验证:email,:presence=>true,
:format=>{:with=>/\A[\w+\-.]+@[A-z\d\-.]+\.[A-z]+\z/i},
:university=>{:区分大小写=>false},
:受限\u电子邮件\u域=>true
...
结束
以及前端和后端的两个独立用户控制器。第一个很简单,效果很好,第二个在下面
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 Admin::userscocontroller:super_admin)
如果@user.save
...
结束
def更新
@user=user.find(参数[:id])
如果@user.update_属性(参数[:user],:as=>:super_admin)
...
结束
结束
我正在使用自定义验证器来检查用户的电子邮件域是否受到限制
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
类限制的MailDomainValidator:super_admin”,则此值为零
record.errors.add(attr_name,:invalid,options.merge(:value=>value))
其他的
域=值。拆分(“@”)[1]
record.errors.add(attr\u name,:restricted\u email\u domain,options.merge(:value=>value))if::RestrictedEmailDomain.where(:domain=>domain).是否存在?
结束
结束
结束
模块ActiveModel::Validations::HelperMethods
def验证受限制的电子邮件域(*属性名称)
使用RestrictedEmailDomainValidator、合并属性(属性名称)验证
结束
结束
更新操作运行良好,但是创建操作提供了当您没有预料到它时,您有一个nil对象config/initializers/restricted\u email\u domain\u validator.rb:3:in'validate\u each'
中的代码>错误。没有:as=>:super\u admin
一切正常,但当然角色ID
和活动属性未分配
我可以手动赋值,但我认为这不是一个完美的解决方案。我可能错了,因为我现在没有办法检查它,但我认为当您编写
attr_accessible :role_ids, :active, :as => :super_admin
- 当您以超级管理员的身份修改这两个属性时,您只能访问这两个属性。所以
@assign_attributes(params[:user],:as=>:super_admin)-仅设置这两个字段,其余字段保持默认状态
你试过类似的东西吗
attr_accessible :login, :email, :password, :password_confirmation ...
attr_accessible :login, :email, :password, :password_confirmation ..., :role_ids, :active, :as => :super_admin
有没有一种方法可以定义默认的属性,然后根据您分配属性的角色将其添加到属性中?因此,避免重复:login,:email,…您可以将attr_accessible[列出常用属性]定义为:[:默认,:superadmin],attr_accessible[列出管理属性],定义为:superadmin@pocNox在那里有一个额外的逗号。应阅读:attr\u accessible list\u of_common\u属性,如:[:default,:superadmin]attr\u accessible list\u of_admin\u attrs,如::superadmin