在我的控制器中,一大堆数字被碾压。百分比乘以100,因此可以将它们存储为整数。以下是部分列表:
tot = @mot[1] + @mot[2] + @mot[3]
exec_pct = @mot[3] / tot * 100
tact_pct = @mot[2] / tot * 100
strat_pct = @mot[1] / tot * 100
然后应该将值写入用户记录,如下所示:
current_user.update_attributes(:strat_pct => strat_pct.to_i, :tact_pct => tact_pct.to_i, :exec_pct => exec_pct.to_i )
数据库具有应存储数据的空值。
这是db schema的相关部分:
t.integer "strat_pct"
t.integer "tact_pct"
t.integer "exec_pct"
更新 -
出于测试目的,我通过插入如下整数来排除计算问题:
current_user.update_attributes(:strat_pct => 1, :tact_pct => 2, :exec_pct => 3 )
和
p current_user.update_attributes(:strat_pct => 1, :tact_pct => 2, :exec_pct => 3 )
字段仍为空。
更新2 - 用户模型:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
attr_accessible :first_name, :last_name, :email, :password, :password_confirmation, :remember_me, :login
validates :first_name, :last_name, :email, :password, :password_confirmation, :presence => true
before_create :create_login
def create_login
self.login = "#{last_name.capitalize}, #{first_name.capitalize}"
end
has_many :answers
has_many :invitations
has_many :feedbacks
end
感谢您的帮助。
答案 0 :(得分:1)
有几件事可能是错的。
首先,尝试:
p current_user.update_attributes(:strat_pct => strat_pct.to_i, :tact_pct => tact_pct.to_i, :exec_pct => exec_pct.to_i )
来自文档:
如果由于连接或远程服务错误而导致保存失败,则会引发异常。如果由于资源无效而导致保存失败,则返回false。
让我感到震惊的另一件事是你的逻辑可能会为一切返回0:
tot = @mot[1] + @mot[2] + @mot[3] #assume [0,100,200,300] = 600
exec_pct = @mot[3] / tot * 100 #300 / 600000 (integers)= 0
tact_pct = @mot[2] / tot * 100 #200 / 600000 (integers)= 0
strat_pct = @mot[1] / tot * 100 #100 / 600000 (integers)= 0
也许你的意思是:
tot = (@mot[1] + @mot[2] + @mot[3]).to_f #assume [0,100,200,300] = 600.0
exec_pct = (@mot[3] / tot) * 100 #300 / 600000.0 (float)= 50.0
tact_pct = (@mot[2] / tot) * 100 #200 / 600000.0 (float)= 33.333
strat_pct = (@mot[1] / tot) * 100 #100 / 600000.0 (float)= 16.666
在ruby中,如果要进行浮点运算,则至少有一个值必须是浮点数。我也假设你在做百分比,所以我在分区操作中添加了括号,因为它需要先执行。
另外,我可能错了,但看起来你不小心将索引编入索引。数组索引从0开始。如果是这种情况,您可以将代码更改为:
@mot = [100,200,300]
total = @mot.inject(:+).to_f
@mot.map {|x| ((x/total.to_f)*100).to_i} #result => [16, 33, 50]
current_user.update_attributes(:strat_pct =>@mot[0], :tact_pct => t@mot[1], :exec_pct => @mot[2] )
修改强>
您的问题在这里:
validates :first_name, :last_name, :email, :password, :password_confirmation, :presence => true
您正在尝试更新属性,但密码和password_confirmation将丢失,因为它不是真实的字段。将该行更改为:
validates :first_name, :last_name, :email, , :presence => true
validates :password, :password_confirmation, :presence => true, :on => :create