Sinatra中参数哈希的怪异行为

问题描述 投票:0回答:1

经过大量调试后,我隔离了一个问题,但无法解释。这是一些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识别为新作用域,该行仍然不会执行。

你看到了吗?

ruby sinatra
1个回答
0
投票

我认为您需要重新学习HTML的stateless nature

您要访问的params变量是根据入站请求的查询params构建的。执行重定向时,您将转到新的URL,并且必须重新构建URL。这样,在重定向的另一侧,可以将其重建为您期望的params哈希。有关更多信息,请参见this page

[将重定向视为一堵您将要攀登的巨墙。如果您想在到达墙壁的另一侧时拥有当前在墙壁上的东西,则在攀登墙壁时必须随身携带。

© www.soinside.com 2019 - 2024. All rights reserved.