我正在使用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 | |
知道什么是错的以及如何解决它?
我正在使用:
感谢您的时间。
答案 0 :(得分:0)
问题在于
@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