0

私の環境: ruby​​ 1.9.3p392 (2013-02-22 リビジョン 39386) [x86_64-linux]

つまり、GET 経由で送信されたパラメーターを ruby​​ に返させることができます。しかし、if/else でメソッドの引数として使用しようとすると、Ruby は何も返さず、空白のページになってしまいます。

ph と pm が正しく返されます。

http://127.0.0.1/cgi-bin/test.rb?hostname=node00.abit.dk&macadd=23:14:41:51:63

戻り値:

node00.abit.dk 23:14:41:51:63

データベース(MySQL)への接続は正常に機能します

メソッド newHostName をテストすると、正しく出力されます。

puts newHostName

戻ります(これは正しいです)

node25.abit.dk

コード:

#!/usr/bin/ruby
require 'cgi'
require 'sequel'
require 'socket'
require 'timeout'

DB = Sequel.connect(:adapter=>'mysql', :host=>'localhost', :database=>'nodes', :user=>'nodeuser', :password=>'...')

#cgi-part to work
#takes 2 parameters:
#hostname & macadd 
cgi = CGI.new
puts cgi.header

p = cgi.params
ph = p['hostname']
pm = p['macadd']

def nodeLookup(hostnameargv)
        hostname = DB[:basenode]
        h = hostname[:hostname => hostnameargv]

        h1 = h[:hostname]
        h2 = h[:macadd]
        ary = [h1, h2]
        return ary
end

def lastHostName()
    #TODO: replace with correct sequel-code and NOT raw SQL
    DB.fetch("SELECT hostname FROM basenode ORDER BY id DESC LIMIT 1") do |row|
        return row[:hostname]
    end
end

def newHostName()
    org = lastHostName
    #Need this 'hack' to make ruby grep for the number
    #nodename e.g 'node01.abit.dk'
    var1 = org[4]
    var2 = org[5]
    var3 = var1 + var2
    sum = var3.to_i + 1
    #puts sum 
    sum = "node" + sum.to_s + ".abit.dk"
    return sum
end

def insertNewNode(newhost, newmac)
    newnode = DB[:basenode]
    newnode.insert(:hostname => newhost, :macadd => newmac)

    return "#{newnode.count}"
end

#puts ph
#puts pm

#puts newHostName
cgi.out() do
    cgi.html do
        begin
            if ph == "node00.abit.dk"
                puts newHostName
            else
                puts nodeLookup(ph)
            end
        end
    end
end

ここで何かが足りない気がします。どんな助けでも大歓迎です!

//M00kaw

4

1 に答える 1

0

次のようにコードの最後の行を変更するのはどうですか? CGI HTML 生成メソッドはブロックを受け取り、ブロックの戻り値をコンテンツとして生成します。したがって、newHostNameまたはnodeLookup(ph)に渡されたブロックの戻り値として、コンテンツを端末に出力して返すのcgi.html()ではなく、作成する必要があります。そのため、空の文字列 ( ) を取得しました。puts sthnilcgi.html()nil.to_s

#puts newHostName
cgi.out() do
  cgi.html do
    if ph == "node00.abit.dk"
      newHostName
    else
      nodeLookup(ph)
    end
  end
end

ps Ruby コードを 2 つのスペースでインデントするのは慣例です :-)

于 2013-05-30T13:36:33.840 に答える