1

Rubyでattrを検証するにはどうすればよいですか?

私のファイルplane.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

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を終了するにはどうすればよいですか?

4

1 に答える 1

2

車輪を再発明する代わりに、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

幸運を。

于 2012-06-04T14:24:57.213 に答える