为什么转储到yaml文件后负值变为正值?

时间:2019-02-22 06:58:45

标签: ruby yaml sinatra

我有一个简单的sinatra应用程序,使用yaml文件处理数据。功能之一是User可以对Question进行投票或否决。投票功能运行良好,但是在实施否决功能时遇到了一些奇怪的事情。

简短地说:

  • 当问题的当前votes_count为正(>= 1)时,该数字将正确减少
  • 但是当问题的当前votes_count为零或负数时,该数字将成功减少data哈希中的值,但是在将data哈希值转储到yaml文件中之后,负数将变为正数。

这是Question的yaml文件:

'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文件中之后,{{1 yaml文件中用户的}}成为"votes_count"。并且,如果哈希中的值为1,它将在yaml文件中变为-2

我尝试制作一个在irb中具有负值的哈希,然后将其转储到yaml文件中,一切正常。我不知道发生了什么事。有人可以帮我吗?

1 个答案:

答案 0 :(得分:5)

看起来像是行中的问题

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

您删除了-

例如

"-1".delete("---") #=> "1"