Rails 3 app - 值不存储

时间:2011-05-27 20:21:28

标签: ruby-on-rails-3

在我的控制器中,一大堆数字被碾压。百分比乘以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

感谢您的帮助。

1 个答案:

答案 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