2013-12-18 26 views
0

this tutorial創建路線的POST:郵政發行與西納特拉

post '/secret' do 
    params[:secret].reverse 
end 

當我認爲這個在本地服務器上我反把我的祕密信息。但是如果我想打印另一行,在反向行的下面,輸出將全部搞亂localhost:9393。

post '/secret' do 
    p params[:secret].reverse 
    p params[:secret].reverse 
end 

任何想法,爲什麼,在第二個代碼塊中,只有一條線反轉祕密的主網頁上表單輸入的祕密後顯示在我的輸出?我正在編寫更復雜的代碼,但它似乎只是打印最後一行。這是西納特拉的事嗎?

+0

定義「搞砸了」。這是你在一條線上的兩倍扭轉的祕密嗎?如果是這樣,這是一個HTML的事情,與西納特拉無關。 – Amadan

+0

對不起,「搞砸」我的意思是它不打印出兩條線。它只打印出底線。如果我添加第三行「helloworld」,它將只在本地主頁上顯示helloworld。 – user3116998

回答

2

在你的第一個例子中,你看到你的祕密是相反的,因爲Sinatra從塊中取出反轉的字符串並顯示它。

在您的第二位代碼中,您將反轉字符串打印到本地輸出,這是您希望顯示日誌的地方。你看到了一個亂七八糟的字符串,因爲p params[:secret].reverse的結果不是Sinatra顯然想要正確顯示的東西。如果沒有其他輸出建立,Sinatra將回退嘗試顯示從路徑塊返回的值。

您正在關注的教程的下一部分將介紹視圖和模板。這些是你將用來輸出網頁的內容。

1

這就是Sinatra的工作原理。 post塊的返回值作爲響應發送。塊的返回值始終是塊內最後一條語句的返回值。所以你的p實際上是沒用的,它只會打印日誌的祕密。它只是發生p返回它打印後傳遞的值,所以你仍然看到一行,因爲這是塊的返回值。如果您確實想要返回包含該行兩次的響應,則必須構建一個包含兩行的單個字符串。有很多方法可以做到這一點,這裏有一些:

# use string interpolation to create a string that 
# contains reversed_secret, followed by a newline, 
# then again followed by reversed_secret 
post '/secret' do 
    reversed_secret = params[:secret].reverse 
    "#{reversed_secret}\n#{reversed_secret}" 
end 

# use an array and join the values with a newline 
post '/secret' do 
    reversed_secret = params[:secret].reverse 
    [reversed_secret, reversed_secret].join("\n") 
end 

# "print" individual lines to a StringIO object 
# and read the resulting string afterwards 
post '/secret' do 
    result = StringIO.new 

    reversed_secret = params[:secret].reverse 

    result.puts reversed_secret 
    result.puts reversed_secret 

    result.string 
end 

無論什麼最適合你。

1

哦,我明白了。您正在使用p。與PHP不同,Sinatra不捕獲標準輸出。而是作爲頁面內容返回的內容是從函數返回的內容。

在第一個示例中,返回reverse的結果。

在第一個示例中,您返回nil,這是第二個p調用的結果。

如果你想同時返回挫折,你需要構建一個包含他們兩個字符串:

post '/secret' do 
    "#{params[:secret].reverse}\n#{params[:secret].reverse}" 
end