1

モデルユーザーがいます

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

フロントエンドとバックエンド用の2つの個別のユーザーコントローラー。最初のものは非常に些細でうまく機能し、2番目のものは下にあります

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_idsactive

手動で値を割り当てることはできますが、完璧な解決策ではないと思います。

4

1 に答える 1

2

今はチェックする方法がないので間違っているかもしれませんが、書くと

attr_accessible :role_ids, :active, :as => :super_admin
  • super_adminとして変更すると、これら2つの属性にのみアクセスできます。したがって、@ user.assign_attributes(params [:user]、:as =>:super_admin)-これら2つのフィールドのみを設定し、残りはデフォルト状態のままにします。

次のようなことを試しましたか

attr_accessible :login, :email, :password, :password_confirmation ...
attr_accessible :login, :email, :password, :password_confirmation ..., :role_ids, :active, :as => :super_admin
于 2012-05-16T14:58:51.867 に答える