为什么这个应用程序控制器不会向调用的控制器返回正确的值?

时间:2013-01-29 09:01:04

标签: ruby-on-rails ruby-on-rails-3

执行此操作时,为什么我会变空? Asumming用户的观点是2500.它应该返回83

posts_controller

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

application_controller

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

2 个答案:

答案 0 :(得分: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(如果它甚至是一个整数...在这种情况下我怀疑)。

答案 1 :(得分:1)

要回答这个问题,您应该尝试检查user.point方法中的percentagecount_percentage值。

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