sinatra浏览器上不显示Ruby输出

时间:2014-01-22 20:29:12

标签: ruby multithreading sinatra

我想建立多线程应用程序。如果我不使用线程,一切正常。当我尝试使用线程时,浏览器上没有显示任何内容。当我使用语法'puts'%s“%io.read'然后它显示在命令提示符而不是浏览器上。任何帮助将不胜感激。

    require 'sinatra'
    require 'thread'
    set :environment, :production

    get '/price/:upc/:rtype' do
        Webupc = "#{params[:upc]}"
        Webformat = "#{params[:rtype]}"
   MThread = Thread.new do 
        puts "inside thread"
        puts "a = %s" %Webupc
        puts "b = %s" %Webformat
        #call the price
        Maxupclen = 16
        padstr = ""
        padupc = ""
        padlen = (Maxupclen - Webupc.length)
        puts "format type: #{params[:rtype]}"
        puts "UPC: #{params[:upc]}"
        puts "padlen: %s" %padlen
        if (Webformat == 'F')
           puts "inside format"
           if (padlen == 0 ) then
              IO.popen("tstprcpd.exe #{Webupc}") 
                    { |io| 
              "%s" %io.read
            }
           elsif (padlen > 0 ) then
              for i in 1 .. padlen
              padstr = padstr + "0"
              end
              padupc = padstr + Webupc
              puts "padupc %s" %padupc
              IO.popen("tstprcpd.exe #{padupc}") { |io| 
              "%s" %io.read
              }
           elsif (padlen < 0 ) then
              IO.popen("date /T") { |io| 
              "UPC length must be 16 digits or less." %io.read 
              }
           end
        end 
        end
    end

1 个答案:

答案 0 :(得分:3)

您的代码有几个问题:

  1. 格式不正确
  2. 您正在使用Uppercase个名称作为变量;这使它们成为常数!
  3. puts不会输出到浏览器,而是输出到控制台。浏览器将接收块的返回值,即块中最后一个语句的返回值。因此,您需要以不同方式构建输出(见下文)。
  4. 你永远不会加入主题
  5. 这是一个使用线程的最小sinatra应用程序。但是,在这种情况下,该线程没有意义,因为在将结果输出到浏览器之前,必须等待它的终止。为了构建输出,我使用了StringIO,您可以使用puts方便地构建多行字符串。但是,您也可以使用res的空字符串初始化res = "",然后使用res << "new line\n"将您的行追加到此字符串。

    require 'sinatra'
    require 'thread'
    require 'stringio'
    
    get '/' do
      res = StringIO.new
    
      th = Thread.new do
        res.puts 'Hello, world!'
      end
    
      th.join
    
      res.string
    end