【问题标题】:ruby cgi wont return method calls, but will return parametersruby cgi 不会返回方法调用,但会返回参数
【发布时间】:2013-05-26 01:08:47
【问题描述】:

我的环境:ruby 1.9.3p392(2013-02-22 修订版 39386)[x86_64-linux]

问题是,我可以让 ruby​​ 返回通过 GET 发送的参数。但是当我试图在 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

【问题讨论】:

    标签: ruby cgi return if-statement


    【解决方案1】:

    如何修改代码的最后几行? CGI HTML 生成方法接受一个块并产生块的返回值作为它们的内容。因此,您应该将newHostName 或nodeLookup(ph) 作为传递给cgi.html() 的块的返回值,而不是puts sth,后者将内容打印到您的终端并返回nil。这就是为什么cgi.html() 得到一个空字符串 (nil.to_s)。

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

    p.s. ruby​​ 代码缩进 2 个空格是惯例:-)

    【讨论】:

    • 感谢您帮助我:> 我将修复 2 空格的问题。从 if/else 中删除“puts”并没有帮助。它仍然没有输出任何东西:/
    • 查看您的 cgi 服务器的日志文件。你可能会在那里找到一些有用的东西。或者您可以尝试在调试时不依赖数据库,只需从cgi.out() 返回一些硬编码字符串,看看是否有效。数据库连接可能有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    相关资源
    最近更新 更多