У меня есть простое приложение 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, всеработать хорошоЯ понятия не имею, что случилось.Кто-нибудь может мне помочь?