2

私はルビーとレールに非常に慣れていません。解析されたすべてのwhois情報をjson出力に出力しようとしています。私は次のものを持っています:

class WhoisController < ApplicationController
  def index
    c = Whois::Client.new
    record = c.lookup("google.com")
    parser = record.parser
    created = parser.created_on
    msg = {:created => created}
    render :json => msg
  end
end

出力:

{"created":"1997-09-15T00:00:00.000-07:00"}

ただし、パーサーにはさらに多くの情報があります....使用可能なすべてのフィールドを知らなくても、すべてのキー/値をjsonにダンプするにはどうすればよいですか?

私はもう試した:

class WhoisController < ApplicationController
  def index
    c = Whois::Client.new
    record = c.lookup("google.com")
    parser = record.parser
    msg = {:whois => parser}
    render :json => msg
  end
end

しかし、最終的には次のようになります。

SystemStackError in WhoisController#index

編集:

私も試しました:

parser.attributes.each do |attr_name, attr_value|
  puts attr_name
end

しかし、最終的に別のエラーが発生します。

undefined method `attributes' for #<Whois::Parser:0x00007fc030d74018>

Python と Go (リフレクションによる) の両方でこれを行うことができます。これを達成するRubyの方法は何ですか?

編集:

class WhoisController < ApplicationController
    def index
        c = Whois::Client.new
        record = c.lookup("google.com")
        parser = record.parser
        msg = {}
        for x_prop in Whois::Parser::PROPERTIES
            msg[x_prop] = parser.send(x_prop)
        end
        render :json => msg
    end
end

これは、すべてのプロパティがパーサーに存在する場合にのみ機能します。ただし、一部のドメイン名にはすべてのプロパティが含まれていないため、次のようになります。

Unable to find a parser for property `registrant_contacts'

次に、そのプロパティが存在する場合にのみ設定しようとします。

msg = {}
for x_prop in Whois::Parser::PROPERTIES
  parser.has_attribute?(:x_prop) 
    msg[x_prop] = parser.send(x_prop) 
end
render :json => msg

別のエラーが発生します:

undefined method `has_attribute?'

編集#3:

私も試しました:

msg = {}
for prop in Whois::Parser::PROPERTIES
  msg[prop] = parser.send(prop) if parser.respond_to?(prop)
end
render :json => msg

プロパティがパーサーにない場合、これはまだ失敗します。;(

4

3 に答える 3

2
class WhoisController < ApplicationController
    def index
        c = Whois::Client.new
        record = c.lookup("google.com")
        parser = record.parser
        msg = {}
        for x_prop in Whois::Parser::PROPERTIES
            msg[x_prop] = parser.send(x_prop)
        end
        render :json => msg
    end
end

まれに、これをエスケープするために、何かのプロパティが空でエラーが発生することがあります。

begin
    msg[x_prop] = parser.send(x_prop)
rescue
    # do nothing
end
于 2019-02-03T07:22:31.227 に答える
-2

methodsまたはを使用できますinspect

    c = Whois::Client.new
    record = c.lookup("google.com")
    parser = record.parser
    render json: parser.methods.to_json
    render json: parser.inspect.to_json
于 2019-02-03T02:18:31.607 に答える