1

Jumpstart Labsで Sinatra を使用して WebGuesser を構築しています。ブラウザのテキスト フィールドに数値を入力します。[送信] をクリックすると、数値が低すぎるか高すぎるか (または 5 以内) という応答が返されるはずです。Shotgun を使用してサーバーをロードします。推測するたびに乱数を変更せずに数字を推測できるようにしたい。

コード:

require 'sinatra'
require 'sinatra/reloader'


def check_guess(guess)
if params["guess"].to_i == guess
        "You got it right!"
elsif params["guess"].to_i > guess 
    if params["guess"].to_i > (guess + 5)
        "Way too high!"
    else 
        "Close.. but too high!"
    end
elsif params["guess"].to_i < guess
    if params["guess"].to_i < (guess - 5)
        "Way too low!"
    else
        "Close.. but too low!"
    end
end
end 


# Home route
get '/' do 
    SECRET_NUMBER = rand(100)
    message = check_guess(SECRET_NUMBER)
    erb :index, :locals => { :message => message }
end

現在、推測するたびに新しい乱数を取得しますが、これは役に立ちません。私のSECRET_NUMBERがスコープ的にどこにあるかと関係があるように感じます。何かご意見は?

4

4 に答える 4

4

への GET リクエストがあるたび"/"に、関連するコードが実行され、(警告付きで) 新しい が生成されますSECRET_NUMBER

これに対処する 1 つの方法は、最初の推測 (この場合、秘密の番号を生成する必要があります) と、連続する推測 (この場合、新しい秘密の番号を生成するべきではありません) で異なる URL にルーティングすることです。

また、時間の経過とともに変化するものに定数を使用することは、非常に悪い習慣です。

于 2013-07-15T17:19:56.793 に答える
1

私は今、まったく同じ質問を探していました。

require "sinatra"
require "sinatra/reloader"

number = rand(100)

get '/' do
  guess = params["guess"].to_i
  message = check_guess(guess, number)
  erb :index, :locals => {:bok => number, :alert => guess, :msg => message}
end

rng を get ブロックの外に置くだけでうまくいきました。生成された番号は、コード内の何かを変更するまで (末尾にスペースを追加してファイルを保存しても、番号を再ランダム化することができます)、サーバーを完全に再起動するまで同じままです。

定数(SECRET_NUMBER)については、最初に定数として定義するので、check_guessメソッドに引数を1つだけ与えると役立ちます。(私はルビーに慣れていないので、間違っていれば誰かが私を修正できます。)

SECRET_NUMBER = rand(100)

get '/' do ... end

def check_guess(guess)
  if guess < SECRET_NUMBER
    "Your Guess is Too LOW!"
  elsif guess > SECRET_NUMBER
    "Your Guess is Too HIGH!"
  else
    "Conguratulations! You guessed it right:)"
  end
于 2016-12-10T10:55:05.397 に答える
0

まだ答えを探している人のために。rand は get ブロックの外で定義する必要があります

require 'sinatra'
require 'sinatra/reloader'
rand = (rand() * 100).to_i
get '/' do

  "The secret number is #{rand}"
end
于 2019-03-27T17:21:32.533 に答える