【问题标题】:Ruby Sinatra storing variablesRuby Sinatra 存储变量
【发布时间】:2016-05-15 20:36:54
【问题描述】:

在下面的代码中,最初的 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

【问题讨论】:

  • 请以正确的格式编辑您的问题。
  • 谢谢你,你是怎么让它这样工作的?我的意思是把所有的代码都放到窗口框里?
  • 您是否有理由没有将表单发布到 /game 并在该代码块中进行处理?
  • 实际上是的,因为我只想将帖子中生成的值存储在 '/' do action 中,这样每次我得到 '/game' 时它都不会改变,因为那样会生成另一种形式这将被提交多次。

标签: ruby hyperlink routes sinatra


【解决方案1】:

你不能这样做:

@letters = Game.new(n)

每次创建请求时,都会创建新的 Request 实例,因此 @letters 属性不再存在。

相当于

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

r = Request.new()
r.letters  # not defined anymore!!

你可以使用类变量来实现你想要的

@@letters = Game.new(n)

虽然当您有多个用户时这将成为一场噩梦,并且仅在您有一个 ruby​​ 服务器进程时才有效。

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

【讨论】:

  • 谢谢,我会研究这些选项!
猜你喜欢
  • 1970-01-01
  • 2013-11-28
  • 2012-10-07
  • 2014-03-23
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多