Почему отрицательное значение становится положительным после сброса в файл yaml? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть простое приложение sinatra, использующее файлы yaml для обработки данных.Одной из функций является User возможность голосовать или наложить вето на Question.Функция голосования работает нормально, но я столкнулся с некоторыми странными вещами при реализации функции вето.

Коротко говоря:

  • , когда текущий вопрос votes_count положительный (>= 1)число будет корректно уменьшаться
  • , но если текущий вопрос votes_count равен нулю или отрицателен, число будет успешно уменьшаться в хеше data, а после дампа хеша data в файл yaml, отрицательностановится положительным.

Это файл yaml для Question:

'1': !ruby/hash:Sinatra::IndifferentHash
  title: " Best way to require all files from a directory in ruby?"
  description: What's the best way to require all files from a directory in ruby ?
  user_id: '3'
  votes_count: 0

# other user information

Этот обработчик маршрута относится к функции вето:

post "/questions/:id/veto" do
  check_vote_validity_for_question(params[:id])
  @question = Question.find_by(:id, params[:id])
  @question.votes_count = (@question.votes_count.to_i - 1)
  Question.update(params[:id], votes_count: @question.votes_count )
  # omit user related code
end

Это метод update:

  def self.update(id, attrs)
    data = load_data_of(data_name)
    # binding.pry
    obj_info = data[id]
    attrs.each do |k, v|
      v = v.to_s if v.is_a?(Array)
      obj_info[k] = v
    end
    # binding.pry
    File.open(File.join(data_path, "#{data_name.to_s}.yaml"), "w+") do |f|
      f.write(Psych.dump(data).delete("---"))
    end
  end

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

До:

[1] pry(Question)> data
=> {"1"=>
  {"title"=>" Best way to require all files from a directory in ruby?",
   "description"=>"What's the best way to require all files from a directory in ruby ?",
   "user_id"=>"3",
   "votes_count"=>0},

После:

[1] pry(Question)> data
=> {"1"=>
  {"title"=>" Best way to require all files from a directory in ruby?",
   "description"=>"What's the best way to require all files from a directory in ruby ?",
   "user_id"=>"3",
   "votes_count"=>-1},

Значение ключа "votes_count" в data хэше равно -1 после обновления, но после того, как явыгрузив хеш data в файл yaml, значение "votes_count" пользователя в файле yaml стало 1,И если значение в хэше равно -2, оно станет 2 в файле yaml.

Я попытался создать хеш, имеющий отрицательное значение в irb, затем выгрузить его в файл yaml, всеработать хорошоЯ понятия не имею, что случилось.Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 22 февраля 2019

Выглядит проблема в строке

f.write(Psych.dump(data).delete("---"))

Вы удаляете -.

Например

"-1".delete("---") #=> "1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...