我如何在Ruby中验证attr

时间:2012-06-04 09:44:29

标签: ruby

我如何在Ruby中验证attr?

我的文件airplane.rb

class Airplane

include Validatable

attr_reader   :aircraft_type, :weight
attr_accessor :speed, :altitude, :course

def initialize(aircraft_type, options={})
    @aircraft_type  = aircraft_type.to_s 
    @course                 = options[:course]     || random_course  
    @weight         = options[:weight]     || rand(1...1000)
    @speed          = options[:speed]      || rand(1...500)
    @apltitude      = options[:apltitude]    || rand(50...3000)
    @position_x         =   options[:position_x] || rand(1...3000)
  @position_y           = options[:position_y] || rand(1...3000)
  check_course
end 

def position
 @position = [@position_x, @position_y]
end

def check_course
if @course < 1
    @course = 1
    puts "Invalid course. Set min"
elsif @course > 360
    @course = 360
    puts "Invalid course. Set max"
else
    @course = @course
    end
end

def random_course
@course = rand(1..360)
end

我的文件validatable.rb,其中必须检查所有值

module Validatable

@@validations={}
# I need receive = {presence: [:weight, :length], aircraft_type: [:length]}

def self.validates_presence_of(*attrs)
    @@validations[:presence] = attrs
end

def validate 
    @@validations.each do |v, fields| 
        fields.each {|field_name| self.send("validate_#{v}_of", field_name)}
    end
end

private 

    def validate_presence_of(field_name)
    end

我的文件init.rb with airplanes attr

airplane1 = Airplane.new("Boeing 74", course: 600, speed: 300, apltitude: 300)
airplane2 = Airplane.new("Boeing 700", course: 250, speed: 300, apltitude: 300)
airplane3 = BigAirplane.new("Boeing 707", weight: 50, speed: 300, apltitude: 400)

如何完成validatable.rb验证每架飞机的每个值?

1 个答案:

答案 0 :(得分:1)

使用ActiveModel :: Validations而不是重新发明轮子。

参见:

http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/

http://www.rubyinside.com/rails-3-0s-activemodel-how-to-give-ruby-classes-some-activerecord-magic-2937.html

http://asciicasts.com/episodes/211-validations-in-rails-3
祝你好运。