SitePoint Sponsor

User Tag List

Results 1 to 2 of 2

Hybrid View

  1. #1
    SitePoint Guru silver trophy Luke Redpath's Avatar
    Join Date
    Mar 2003
    Location
    London
    Posts
    794
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Bizarre ActiveRecord::Errors/validation problem

    I could be going mad and missing something really obvious here but I'm getting an unexpected result from the following.

    The schema:

    Code:
    create_table :services, :force => true do |t|
        t.column :id, :primary_key
        t.column :name, :string, :ilmit => 5, :null => false
        t.column :port, :integer, :null => false
        t.column :status, :string
    end
    The model:

    Code:
    class Service < ActiveRecord::Base
        validates_presence_of :name, :port, :status
    end
    The unit tests:

    Code:
    class ServiceTest < Test::Unit::TestCase
      def test_new_service
            @service = Service.new
            @ service.name = 'www'
            @service.port = 80
            @service.status = 'Unknown'
            assert @service.save
      end
    
        def test_invalid_service
            @service = Service.new
            assert !@ service.save
            assert_equal "can't be blank", @service.errors['name']
            assert_equal "can't be blank", @service.errors['status']
            assert_equal "can't be blank", @service.errors ['port']
        end
    end
    The first test passes fine, but the second test is failing on that last assertion with:

    Code:
    => <"can't be blank"> expected but was
    => <nil>.
    Any idea why the validate_presence_of method isn't picking up the ort column and providing an appropriate error message like it is with name/status? Its not a reserved word or something is it?

    To aid debugging, here is the output of:

    Code:
    @service.errors.each_full { |m| puts m }
    => Name can't be blank
    => Status can't be blank
    As you can see, no sign of my error message for the port column.

  2. #2
    SitePoint Guru silver trophy Luke Redpath's Avatar
    Join Date
    Mar 2003
    Location
    London
    Posts
    794
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    OK I fixed this. What was throwing it out was the fact that port was a numeric field, and Rails was setting it as 0 by default, so it was always passing the presence_of validation. Updated my test to use the following assertion instead:

    Code:
    assert_equal "must be greater than 0", @service.errors['port']
    
    # in the model:
    def validate
      errors.add :port, 'must be greater than 0' if port == 0
    end


Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •