Странное поведение параметров ha sh в Синатре - PullRequest
0 голосов
/ 27 февраля 2020

После многих отладок у меня возникла проблема, но я не могу ее объяснить. Вот немного кода Синатры:

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 value.

Я заключаю, что, присваивая значение params внутри условного выражения, которое НЕ ВЫПОЛНЕНО, параметры ha sh (который на самом деле является методом из Sinatra) становятся равными нулю.

Даже если в Ruby было что-то с переменной областью видимости, которое не распознает if / then как новую область видимости, но эта строка не выполняется.

Вы видите это?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Вы, похоже, путаете метод params для локальной переменной params.

Давайте рассмотрим упрощенный пример:

def params
  {"action" => "some-action"}
end

# the line below refers to the method #params
p params # {"action" => "some-action"}

# the variable params is created, but not assigned
params = {n: 1} if false

# any further reference to params will use the variable
p params # nil

Если у вас возник вопрос "Почему создается переменная?" простой ответ таков: потому что в документации говорится так.

Локальная переменная создается, когда синтаксический анализатор встречает назначение, а не когда это происходит:

a = 0 if false # does not assign to a

p local_variables # prints [:a]

p a # prints nil

Чтобы решить вашу проблему, либо используйте установщик #params= (при условии, что он есть), либо извлеките результат метода в переменную, с которой нужно начинать, таким образом, все ссылки на params ссылаются на переменную.

# assign using the setter method
self.params = { :n => @number }

# extract the contents to a variable at the start
# of the `post '/modify' do` block
params = self.params # or params()
0 голосов
/ 28 февраля 2020

Я думаю, вам нужно разобраться sh с природой HTML в состоянии без состояния в " Почему протокол HTTP называется протоколом без состояния? ".

Переменная params, к которой вы обращаетесь, создается из параметров запроса вашего входящего запроса. Когда вы выполняете перенаправление, вы переходите на новый URL, и вам необходимо встроить параметры запроса в URL. Таким образом, с другой стороны перенаправления его можно перестроить в ожидаемый params га sh. См. «Переадресация браузера» в « Getting Started» Sinatra для получения дополнительной информации.

Думайте о перенаправлении как о гигантской стене, на которую вы собираетесь взобраться. Если вы хотите иметь что-то, что у вас есть на вашей стороне стены, когда вы переходите на другую сторону стены, вы должны взять это с собой, когда поднимаетесь на стену.

...