Ruby Sinatra存储变量

Ruby Sinatra存储变量,ruby,hyperlink,routes,sinatra,Ruby,Hyperlink,Routes,Sinatra,在下面的代码中,初始get“/”包含一个表单,其操作是post“/”。当用户输入一个数字时,它应该被转换成一个变量,用于调用Game类,我为该类生成了另一个动作,以在get'/Game'上显示一个新的表单。未存储post方法中生成的变量。如何存储post中创建的变量,然后链接到get'/game'操作 require 'sinatra' require 'sinatra/reloader' @@count = 5 Dict = File.open("enable.txt") class Gam

在下面的代码中,初始get“/”包含一个表单,其操作是post“/”。当用户输入一个数字时,它应该被转换成一个变量,用于调用Game类,我为该类生成了另一个动作,以在get'/Game'上显示一个新的表单。未存储post方法中生成的变量。如何存储post中创建的变量,然后链接到get'/game'操作

require 'sinatra'
require 'sinatra/reloader'
@@count = 5
Dict = File.open("enable.txt")

class Game
   attr_accessor :letters, :number, :guess, :disp
   @@count = 5

   def initialize (number)
     letters = find(number) 
   end

   def find (n)
     words =[]
     dictionary = File.read(Dict)  
     dictionary.scan(/\w+/).each {|word| words << word if word.length == n}
     letters = words.sample.split("").to_a 
     letters
   end

   def counter
         if letters.include?guess
            correct = check_guess(guess, letters)
          else
           @@count -= 1
          end
   end
end

get '/' do 
   erb :index
end

post '/' do 
  n = params['number'].to_i
  @letters = Game.new(n) 
  redirect '/game' 
end

get "/game" do 


   guess = params['guess']
   letters = @letters
   if guess != nil
     correct = check_guess(guess, letters)
   end
   disp = display(letters, correct)          

   erb :game, :locals => {:letters => letters, :disp => disp}  

end



   def display(letters, correct)
     line = "__"
     d=[]
     letters.each do |x| 
       if correct == nil
         d << line
       elsif correct.include?x  
         d << x  
       else
         d << line
       end
     end
     d.join(" ")
   end 


   def check_guess(guess, letters)
     correct = [] 
     if guess != nil   
       if letters.include?guess
         correct << guess
       end
     end
     correct
   end
需要“sinatra”
需要“sinatra/重新装载机”
@@计数=5
Dict=File.open(“enable.txt”)
班级游戏
属性访问器:字母、数字、猜测、显示
@@计数=5
def初始化(编号)
字母=查找(数字)
结束
def查找(n)
单词=[]
dictionary=File.read(Dict)
dictionary.scan(/\w+/)。每个{单词}单词{:字母=>letters,:disp=>disp}
结束
def显示(字母,正确)
行=“\uuuu”
d=[]
字母。每个都有| x |
如果正确==nil
d您不能这样做:

@letters = Game.new(n)
每次创建请求时,都会创建新的请求实例,因此
@letters
属性不再存在

这相当于

r = Request.new()
r.letters = Game.new()

r = Request.new()
r.letters  # not defined anymore!!
您可以使用类变量来实现所需的功能

@@letters = Game.new(n)
尽管当您有多个用户时,这将成为一场噩梦,并且只有当您只有一个ruby服务器进程时,这才起作用

更高级的方法是将
参数['number']
存储在会话cookie或数据库中。

您不能这样做:

@letters = Game.new(n)
每次创建请求时,都会创建新的请求实例,因此
@letters
属性不再存在

这相当于

r = Request.new()
r.letters = Game.new()

r = Request.new()
r.letters  # not defined anymore!!
您可以使用类变量来实现所需的功能

@@letters = Game.new(n)
尽管当您有多个用户时,这将成为一场噩梦,并且只有当您只有一个ruby服务器进程时,这才起作用


更高级的方法是存储
params['number']
在会话cookie或数据库中。

请用正确的格式编辑您的问题。谢谢,您是如何让它这样工作的?我的意思是将所有代码都放入窗口框中?您没有表单post to/game并在该代码块中进行处理有什么原因吗?实际上是的,因为我想存储值gen在帖子“/”中只执行一次操作,这样它就不会在每次收到“/game”时更改,因为这将生成另一个表单,该表单将被提交多次。请使用正确的格式编辑您的问题。谢谢,您是如何让它像这样工作的?我的意思是将所有代码放入窗口框中?您有没有理由不这样做表单post to/game并在该代码块中进行处理?实际上是的,因为我只想存储post'/'do action中生成的值一次,这样它就不会在每次获得'/game'时更改,因为这将生成另一个表单,该表单将被提交多次。谢谢,我将研究这些选项!谢谢,我将查看进入那些选项!