Ruby Sinatra存储变量
在下面的代码中,初始get“/”包含一个表单,其操作是post“/”。当用户输入一个数字时,它应该被转换成一个变量,用于调用Game类,我为该类生成了另一个动作,以在get'/Game'上显示一个新的表单。未存储post方法中生成的变量。如何存储post中创建的变量,然后链接到get'/game'操作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
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'时更改,因为这将生成另一个表单,该表单将被提交多次。谢谢,我将研究这些选项!谢谢,我将查看进入那些选项!