我如何在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验证每架飞机的每个值?
答案 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
祝你好运。