2016-10-29 7 views
1

first_nameとlast_nameのいずれかが空でない場合にのみ、RoRモデルで検証を設定して渡す必要があります。これは、最初の2つのテスト 2つの値から1つの値を検証する必要があります!= nil

context "Validators:" do 
    it "does not allow a User without a username" do 
    expect(User.new(:username=> "")).to_not be_valid 
    end 

    it "does not allow a Profile with a null first and last name" do 
    expect(Profile.new(:first_name=>nil, :last_name=>nil, :gender=>"male")).to_not be_valid 
    end 
end 

しかし、次のテストに合格だとすると、エラーメッセージに

it "allows a Profile with a null first name when last name present" do 
    expect(Profile.new(:first_name=>nil, :last_name=>"Smith", :gender=>"male")).to be_valid 
end 

モデル

class Profile < ActiveRecord::Base 
    belongs_to :user 
    validates :gender, inclusion: {in: %w(male, female), message: "Must be male or female"} 
    validate :first_or_last_name 



    def first_or_last_name 
    if first_name && last_name == nil 
     errors.add(:first_name, "Cannot be both nil") 
    end 
    end 

end 

1) Assignment rq11 Validators: allows a Profile with a null first name when last name present 
Failure/Error: expect(Profile.new(:first_name=>nil, :last_name=>"Smith", :gender=>"male")).to be_valid 
    expected `#<Profile id: nil, gender: "male", birth_year: nil, first_name: nil, last_name: "Smith", user_id: nil, created_at: nil, updated_at: nil>.valid?` to return true, got false 
# ./spec/assignment_spec.rb:290:in `block (4 levels) in <top (required)>' 
# ./spec/assignment_spec.rb:12:in `block (2 levels) in <top (required)>' 

スペックを取得します

論理演算子に問題はありますか?

答えて

1

あなたのコードは、first_nameが定義されていてlast_nameがnilであるかどうかをチェックします。

if first_name && last_name == nil 

if first_name && (last_name == nil) 

と同等ですhttps://ruby-doc.org/core-2.2.0/doc/syntax/precedence_rdoc.htmlを参照してください。 ==あなたが試みることができる& &

の前に来る:

if (first_name || last_name) == nil 

または

if first_name.nil? and last name.nil? 

または

最後に
unless first_name or last_name 

を、あなたはおそらく両方の名前を定義する必要はありません空ですので、

私が書くでしょう
if first_name.blank? and last_name.blank? 
+0

上記のすべてをチェックしてください。それでも同じエラー。他のどこかに問題があるはずです –

+0

'validate:first_or_last_name'をコメントアウトすると、仕様は合格しますか? –

+1

しかし、それは解決策に私を導いた。ジェンダーバリデーターはそれを許可しません。 –

2

は、このようなものです:

def first_or_last_name 
    if first_name.blank? && last_name.blank? 
    errors.add(:first_name, "Cannot be both blank") 
    end 
end 

さらにあなたはgenderバリデータの定義でタイプミスを持っています。 %w(male, female)からカンマを削除します。文字列の配列を生成する構文は、カンマを必要としません。%w現時点では"male,""female"しか許可されていません。それを以下に変更してください:

validates :gender, inclusion: { in: %w(male female), 
           message: "Must be male or female"} 
+0

同じエラーです。他のどこかで問題があるはずです –

+0

あなたはRails 5にいますか? Rails 5の 'belongs_to:user'は、ユーザが存在しなければならないことを意味します([もっと読む](http://blog.bigbinary.com/2016/02/15/rails-5-makes-belong-to-association- required-by-default.html))。 – spickermann

+0

いいえ、それはレール4です。しかし助言のおかげで。とにかく問題を解決しました。 –

2

以下のバリデーターが問題でした。

validates :gender, inclusion: {in: %w(male, female), message: "Must be male or female"} 
+1

その行はあなたの質問によく似ています。 '%w(男性、女性)'からカンマを削除します。'%w(男性女性)' '男性のみ '、' '女性' 'のみ許可することをお勧めします。 – spickermann

+0

それだけです。今はうまく動作します。どうもありがとう。 –

関連する問題