经过大量调试后,我隔离了一个问题,但无法解释。这是一些Sinatra代码:
post '/modify' do
# at this point params contains the action key as I expect it.
puts "1: action is #{params["action"]}"
if (params["action"] == "del")
puts "#{params}"
puts "delete"
end
# At this point params still contains the "action" key as I expect it
puts "2: action is #{params["action"]}"
if (params["action"] == 'create')
puts "#{params}"
puts "create"
#### THE NEXT LINE IS THE PROBLEM!
params = { :n => @number }
redirect '/'
end
# At this point params is nil
puts "3: ????? #{params}"
foo = params["action"]
#puts "3: action is #{params["action"]}"
if (foo == "refresh")
puts "***: #{params}"
redirect '/'
end
puts "3: #{params}"
puts "3: action is #{params["action"]}"
end
当params [“ action”]不等于del或create时,编写的此代码将给出错误,即[]对nil值无效。
[我的结论是,通过为未执行的条件内的参数分配值,params哈希(实际上是Sinatra的一种方法)将变为nil。
即使在Ruby中具有变量作用域的东西不能将if / then识别为新作用域,该行仍然不会执行。
你看到了吗?
我认为您需要重新学习HTML的stateless nature。
您要访问的params变量是根据入站请求的查询params构建的。执行重定向时,您将转到新的URL,并且必须重新构建URL。这样,在重定向的另一侧,可以将其重建为您期望的params哈希。有关更多信息,请参见this page。
[将重定向视为一堵您将要攀登的巨墙。如果您想在到达墙壁的另一侧时拥有当前在墙壁上的东西,则在攀登墙壁时必须随身携带。