0

为什么执行此操作时会变空?假设用户的积分是 2500。它应该返回 83

post_controller

@user = User.find(params[:id])
@user.percentage = count_percentage(@user)
@user.save

应用程序控制器

def count_percentage(user)
    if user

        if user.point > 2999
            percentage = ((user.point / 5000.0) * 100 ).to_i
        elsif user.point > 1999
            percentage = ((user.point / 3000.0) * 100 ).to_i
        end

        return percentage

    end
end
4

2 回答 2

2

看起来有些缺乏基本的了解,所以我在这里尝试重点关注几点。

count_percentage属于你的型号User这是一种执行与您的记录相关的事情的方法。在您的示例中,代码只能与User记录一起使用。因此它属于你的User班级!

class User < ActiveRecord::Base
  def percentage
    if self.point > 2999
        return ((self.point / 5000.0) * 100 ).to_i
    elsif user.point > 1999
        return ((self.point / 3000.0) * 100 ).to_i
    else
        # personally, I'd add a case for points range 0...3000
    end
  end

正如您所说,您想将该值放入您的“侧边菜单”中,因此这允许例如@user.percentage在那里为您提供所需的百分比。

根据您的描述(如果我理解正确的话),您希望将计算值存储在您的用户模型中。我们又来了:模型逻辑属于你的模型类。如果你想保持你的百分比值是最新的,你可以添加一个回调,比如:

class User < ActiveRecord::Base
  before_save :store_percentage

  def precentage
    # your code here
  end


  private

  def store_percentage
    self.my_percentage_field_from_my_database = self.percentage
  end
end

对于您的实际问题:user.point可能是NULL(db)/ nil(ruby),因此您应该to_i在实际计算之前对其进行转换。这也是为什么我建议else在你的情况下阻止;返回一个值是否user.point大于1999(如果它甚至是一个整数..在这种情况下我怀疑)。

于 2013-01-29T09:38:25.050 回答
1

要回答这个问题,您应该尝试检查方法user.pointpercentage的值count_percentage

我强烈推荐pry。因为它太棒了。

于 2013-01-29T09:28:10.670 回答