Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails属性可访问:as和自定义验证器_Ruby On Rails_Ruby On Rails 3.1_Customvalidator_Attr Accessible - Fatal编程技术网

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