0

ちなみにRails3.1.1を使用しています。これを再現するには、新しいRailsプロジェクトを作成します。このプロジェクト内にExampleという名前で新しいモデルを作成します。次のようなこのモデルの移行を作成します...

class CreateExamples < ActiveRecord::Migration
    def change
        create_table :examples do |t|
            t.integer :status, :null => false
            t.timestamps
        end
    end
end

モデルコードの例を次のようにします...

class Example < ActiveRecord::Base
    VALID_VALUES = [0, 1, 2, 3]

    validates :status, :presence => true, :inclusion => {:in => VALID_VALUES}
end

次に、このモデルの単体テストを編集し、次のコードを追加します...

require 'test_helper'

class ExampleTest < ActiveSupport::TestCase
    test "whats going on here" do
        example = Example.new(:status => "string")
        assert !example.save
    end
end

レコードが作成されないようにフィクスチャファイルを編集してから、bundle exec rake test:unitsなどのコマンドを使用して単体テストを実行します。「文字列」は有効なステータスではないため、このテストに合格する必要があります。そのため、サンプルオブジェクトは保存の呼び出しからfalseを返す必要があります。これは起こっていません。VALID_VALUES配列から0を取得すると、これは機能します。なぜこれが当てはまるのか、誰か考えていますか?

4

1 に答える 1

4

「文字列」は、検証前に整数としてキャストされます(ステータス列は整数であるため)

"string".to_i # => 0

数値バリデーターを使用すると、これを回避できます。

validates :status, :presence => true, :numericality => { :only_integer => true }, :inclusion => {:in => VALID_VALUES}

ところで、あなたは#validを使うことができますか?または#invalid?テストで#saveの代わりにメソッド

于 2012-05-21T12:17:25.743 に答える