2017-01-18 11 views
0

が含まれていることの価値が協会の含まれています。私は、ユーザーの前にその会社の名前は、例えば、その電子メールの内容を保存されていることを必要とする検証は、私は、そのユーザーの電子メールを検証する必要がある他のフィールドのレール

class Company << ApplicationRecord 
    validates :name, presence: true 
    has_many :users 
end 

class User << ApplicationRecord 
    belongs_to :company 
    validate :email, presence: true 
end 

。会社の名前がある場合

は:​​

を私は5.0

アップデートのRailsを使用しています:fedex、ユーザーの電子メールがなければならないmrlewが言っ

として、私はバリデータを書きます方法として、私はapp/validatorに次のように書いた:

#User model 
class User << ApplicationRecord 
    belongs_to :company 
    validate :email, presence: true 
    validates_with UserEmailValidator 
end 

#Validator 
# app/validator/user_email_validator.rb 

class UserEmailValidator < ActiveModel::Validator 

    def validate(record) 
    unless record.email =~ /\A[\w+\-.][email protected]#{record.company.name}\z/i 
     record.errors[:email] << "invalid email" 
    end 
    end 
end 
+0

これを 'validates_format_of:email、:=/^ [\ w \ d] + @ self.company.name +(。[\ w \ d] +)+ $ /'それを試してみてください。 – uzaif

+0

'self.company.name'を補間する' method_missing ':未定義のメソッド' company 'for user(接続を確立するための 'User.c onnection'を呼び出します):Class(NoMethodError)' –

答えて

0

custom validator methodを作成できます。このような何か:

class User << ApplicationRecord 
    belongs_to :company 
    validate :email, presence: true 
    validate :valid_company_email 

    private 

    def valid_company_email 
     unless self.email.match(/\[email protected]#{self.company.name}\.com/) 
      errors.add(:email, :invalid) #or replace :invalid with a custom message 
     end 
    end 

end 

いくつかの考慮事項は:あなたが説明したように

  • すべてのドメインは、.comでなければなりません。
  • @の前:空白以外のすべてを受け入れます。電子メールの正規表現(this answer)を作成するのは難しいですが、それはあなた次第です。
+1

これは機能します!さらにバリデーターを 'app/validators'に移動します。ありがとう。 –

関連する問題