我正在使用 MySQL gem 在 Sinatra 中学习一些基本知识。我正在尝试建立的网站有点像 www.facemash.com.au。
我给访客两张照片,他们投票给一张。当他们投票时,POST 请求将发送到“/vote”路径。
我当前这条路线的处理程序是:
post '/vote' do
@db = Mysql.new(host, user, pass, DB_name)
@old_winner_vote = @db.prepare "SELECT wins FROM accounts WHERE id = ? "
@winner_vote = @old_winner_vote.execute params[:winer]
@winner_votes = @winner_vote.fetch.to_s.to_i
@winner_votes += 1
@update_winner_vote = @db.prepare "UPDATE accounts SET wins = ? WHERE id = ? "
@update_winner_vote.execute @winner_votes, params[:winer]
@old_looser_vote = @db.prepare "SELECT looses FROM accounts WHERE id = ? "
@looser_vote = @old_looser_vote.execute params[:looser]
@looser_votes = @looser_vote.fetch.to_s.to_i
@looser_votes += 1
@update_looser_vote = @db.prepare "UPDATE accounts SET looses = ? WHERE id = ? "
@update_looser_vote.execute @looser_votes, params[:looser]
@db.close
redirect '/', 303
end
看起来某处出了问题,因为 wins
/looses
永远不会高于 1。我尝试将它们重置为 0,它们从 0 更新为1,但绝不会更高。
我还尝试从 MySQL 控制台将它们设置为更高的数字,并且它们已成功更新,但是当我的 Sinatra 应用程序尝试更新它们时,它们重置为 1。
MySQL DB中的wins
/looses
定义如下:
| wins | int(10) unsigned | YES | | NULL | |
| looses | int(10) unsigned | YES | | NULL | |
知道出了什么问题以及如何解决吗?
我正在使用:
- Ubuntu 14.04 x64 位
- ruby 2.2.0p0(2014-12-25 修订版 49005)[x86_64-linux]
- 西纳特拉 1.4.5
- mysql 2.9.1
- 精简1.6.3
感谢您的宝贵时间。
最佳答案
问题出在
@winner_vote = @old_winner_vote.execute params[:winer]
@winner_votes = @winner_vote.fetch.to_s.to_i
当调用@winner_vote.fetch时,它返回:[#],然后调用.to_s将其变成“[#]”,因此调用.to_i将始终给出0,因此调用+1将给出1,在第二次调用时它将给出以同样的方式获取“[1]”作为字符串,0作为整数递增将得到1,这就是为什么它永远不会高于1。 这可以这样修复:
@winner_votes = @winner_vote.fetch.to_s[1...-1].to_i
这样调用.to_s[1..-1]将删除[],只留下里面的数字,然后它会将数字加1并成功更新数据库。 同样的修复适用于@looser_votes
@looser_votes = @looser_vote.fetch.to_s[1...-1].to_i
关于mysql - 更新后数据库字段未更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28611500/