2015-04-27 2 views
1

Я пытаюсь написать класс для хранения запретов. Я хочу, чтобы проверить, является ли данный IP запрещен и вернуть @ip, @time, @reason и т.д .:Как написать этот класс ruby?

class BannedIP 
    attr_reader :ip, :time, :reason 
    def initialize(ip, time, reason) 
    @ip = ip 
    @time = time 
    @reason = reason 
    end 
    def banned?(ip) 
    # What do I use here? 
    end 
end 

мне нужна помощь с частью # What do I use here? так, что я могу сделать что-то вроде:

if b = BannedIP.banned? '10.10.10.10' 

ответ

0

Установить mysql2 и активные записи драгоценных камней

gem install mysql2 
gem install active_record 

Затем выполните следующий код снимка

require 'active_record' 
require 'mysql2' 

SOURCE_CREDNTIALS = { 
    :adapter => "mysql2", 
    :host  => "localhost", 
    :username => "root", 
    :password => "password", 
    :database => "banned_db" 
} 

class Banned < ActiveRecord::Base 
    ActiveRecord::Base.establish_connection(SOURCE_CREDNTIALS) 

    #attr_accessor :id, :ip, :banned_at, :reason 

    def self.banned?(ip) 
    where(ip: ip).count > 0 
    end 

end 

Теперь вы можете использовать этот простой класс как

user_foo = Banned.create(ip: '10.10.10.10', banned_at: Time.now, reason: 'violated terms and conditions') 
Banned.banned?('10.10.10.10') 

BannedIP.banned? метод вернет true или false в зависимости от того, запрещен ли конкретный ip или нет.

+0

Это не требуется. Извините, я забыл удалить это. –

+0

Это работает, но я нахожу его немного хакерским. Кроме того, когда вы бросаете ссылки на объект «BannedIP», он остается запрещенным до сбора мусора. Не уверен, что это предназначено. –

+0

Сборщик мусора не уничтожит объект, если выполняется код, и объекты находятся в области видимости. Но если вы перезапустите систему или что-то еще, вам нужно сохранить данные в базе данных или файловой системе. Попробуйте использовать ярлык active_record для подключения к базе данных и отображения объектов со строками в таблице базы данных. –

0

Немного отходов, чтобы иметь полный класс для этого, если вы не планируете вкладывать в него больше. Если это просто так, то отслеживайте его с помощью массива, было бы проще и стоило бы меньше памяти.

class BannedIP 
    attr_accessor :ip, :time, :reason, :status 

    def initialize(ip) 
    @ip = ip 
    @time = Time.new 
    @reason = reason 
    @status = status.nil? ? false : true 
    end 

    def ban(reason) 
    @reason = reason 
    @time = Time.new 
    @status = true 
    end 
    def unban 
    @reason = "" 
    @time = Time.new 
    @status = false 
    end 
    def banned? 
     return @status 
    end 
end 

if __FILE__ == $0 
    puts "ban the bad guy at 10.0.0.1 because he was cheating" 
    a = BannedIP.new("10.0.0.1") 
    a.ban "he is a cheater!!" 
    puts "The status of 10.0.0.1 is " + a.status.to_s 
end 

$ ruby stack1.rb 
ban the bad guy at 10.0.0.1 because he was cheating 
The status of 10.0.0.1 is true 
+0

Я думаю, OP хочет запретить несколько IP-адресов. –

2

Я не уверен, что возвращение ip, когда вы уже знаете, ip имеет смысл, но Anyhoo ...

Вы можете использовать пользовательский хэш-класс:

class BannedHash < Hash 

    def ban(ip, time, reason) 
     self[ip] = {time: time, reason: reason} 
    end 

    def banned?(ip) 
     if self.include?(ip) 
     self[ip] 
     else 
     "ip: #{ip} not found." 
    end 
    end 

end 

Использование:

def main 
    b = BannedHash.new 
    b.ban("10.10.10.10", Time.now, "Some reason") 
    puts b.banned?("10.10.10.10") 
    puts b.banned?("11.11.11.11") 
end 

Выход:

{:time=>2015-04-27 21:18:39 +1200, :reason=>"Some reason"} 
ip: 11.11.11.11 not found.