2017-10-26 4 views
0

私はExamというモードを持っています。自分の他の列を空白にしないでRails列を検証する方法は?

いくつかの列がexamesにあります。です

class Exam < ApplicationRecord 
    validates :title, presence: true 
    validates :subject_id, presence: true, if: :no_exam_type? 

    def no_exam_type? 
    self.exam_type == "" 
    end 
end 

は私が試験を作成したい、と言って::

:title 
:subject_id 
:exam_type 

が、私はこれを実装する方法を知りたい

Exam.create(title: "first exam", exam_type: "something") 

subject_idは、 exam_typeが空白の場合、そのようなexam_type=""として、存在しないかだけの操作を行います。

Exam.create(title: "first exam", subject_id: 3) 

exam_typeはデフォルトブランク値を持っているので。

しかし、exam_typeexam_type="something"のように空白でない場合、subject_idは必須ではありません。

Exam.create(title: "first exam", exam_type: "something", subject_id: 3) 

私はそれをテストしますが、幸運なことはありません。

どうすればよいですか?ありがとう、感謝します。

答えて

1

に合ったドキュメントhereを参照することができます。これは、モデルが関連の存在を自動的に検証することを意味します。

class Thing < ApplicationRecord 
    belongs_to :other_thing 
end 

Thing.create! 
# => ActiveRecord::RecordInvalid: Validation failed: other_thing can't be blank 

このように、関連付けをオプションとして設定し、その列がNULL可能であることを確認する必要があります。

class Exam < ApplicationRecord 
    belongs_to :subject, optional: true 
    validates :title, presence: true 
    validates :subject_id, presence: true, if: :no_exam_type? 

    def no_exam_type? 
    !self.exam_type.present? 
    end 
end 
-1

validates_presence_ofを代わりに使用してください。

validates_presence_of :subject_id, if: :no_exam_type? 
def no_exam_type? 
    self.exam_type.nil? 
end 
+0

申し訳ありませんが、機能しません。 railsコンソールから 'Exam.create!(title:" title test "、exam_type:" test ")'を実行すると、 'ActiveRecord :: RecordInvalid:'というエラーがあります。 – floox

0

このように試しましたか?

validates :subject_id, presence: true, :if => exam_type.blank? 

あなたはoptional: falseにRailsの5つのbelongs_to団体のデフォルトでは、要件

+0

私はこれを試して、それも動作しません。 – floox

関連する問題