Ravi
Ravi

Reputation: 173

Ruby output is not displayed on the sinatra browser

I want to bulid a multi threaded application. If i do not use threads, everything works fine. When i try to use threads, then nothing is displayed on the browser. when i use the syntax 'puts "%s" %io.read' then it displays on the command prompt and not on the browser. Any help would be appreciated.

    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

Upvotes: 1

Views: 357

Answers (1)

Patrick Oscity
Patrick Oscity

Reputation: 54684

Your code has several problems:

  1. It is not formatted properly
  2. You are using Uppercase names for variables; that makes them constants!
  3. puts will not output to the browser, but to the console. The browser will recieve the return value of the block, i.e. the return value of the last statement in the block. Therefore, you need to build your output differently (see below).
  4. You are never joining the thread

Here's a minimal sinatra app that uses a thread. However, the thread makes no sense in this case because you must wait for its termination anyway before you can output the result to the browser. In order to build the output I have used StringIO, which you can use with puts to build a multiline string conveniently. However, you could also simply initialize res with an empty string with res = "" and then append your lines to this string with 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

Upvotes: 3

Related Questions