应用程序在本地主机上运行良好,但在 Heroku 上有 NoMethodError(nil:NilClass 的未定义方法 `-')

App works fine on Localhost, but has NoMethodError (undefined method `-' for nil:NilClass) on Heroku

我是 Ruby 的新手,现在在将我的应用程序部署到 Heroku 后遇到错误。

我在本地主机上测试我的应用程序,一切正常;然而,当我尝试保存一个新的 post 时,我在 Heroku 上有 "undefined method `-' for nil:NilClass"。我已经在 Whosebug 上搜索了解决方案,但到目前为止我还没有找到任何东西。

我从 heroku 日志中得到的错误:

2015-04-01T03:37:23.412066+00:00 app[web.1]: NoMethodError (undefined method `-' for nil:NilClass):
2015-04-01T03:37:23.412076+00:00 app[web.1]:   app/controllers/topics/posts_controller.rb:22:in `create'
2015-04-01T03:37:23.412074+00:00 app[web.1]:   app/models/post.rb:37:in `save_with_initial_vote'
2015-04-01T03:37:23.407819+00:00 app[web.1]:    (1.0ms)  ROLLBACK
2015-04-01T03:37:23.412070+00:00 app[web.1]:   app/models/vote.rb:20:in `update_post'
2015-04-01T03:37:23.412078+00:00 app[web.1]: 
2015-04-01T03:37:23.412063+00:00 app[web.1]: 
2015-04-01T03:37:23.412068+00:00 app[web.1]:   app/models/post.rb:30:in `update_rank'
2015-04-01T03:37:23.412072+00:00 app[web.1]:   app/models/post.rb:39:in `block in save_with_initial_vote'

从日志来看,问题似乎出在 post.rb 中的 update_rank 方法。

来自我的 app/models/post.rb:

  class Post < ActiveRecord::Base
  has_many :comments, dependent: :destroy
  has_many :votes, dependent: :destroy
  has_many :favorites, dependent: :destroy
  belongs_to :user
  belongs_to :topic

  default_scope { order('rank DESC') }
  scope :visible_to, ->(user) { user ? all : joins(:topic).where('topics.public' => true) }

  validates :title, length: { minimum: 5 }, presence: true
  validates :body, length: { minimum: 20 }, presence: true
  validates :topic, presence: true
  validates :user, presence: true

    def update_rank
        age_in_days = (created_at - Time.new(1970,1,1)) / (60 * 60 * 24)
        new_rank = points + age_in_days

        update_attribute(:rank, new_rank)
      end

      def save_with_initial_vote
        ActiveRecord::Base.transaction do
          post = Post.create
          user.votes.create(value: 1, post: self)
        end
      end

来自 app/controllers/topics/posts_controller.rb:

  def create
    @topic = Topic.find(params[:topic_id])
    @post = current_user.posts.build(post_params)
    @post.topic = @topic
        authorize @post

    if @post.save_with_initial_vote
      flash[:notice] = "Post was saved."
      redirect_to [@topic, @post]
    else
      flash[:error] = "There was an error saving the post. Please try again."
      render :new
    end
  end

models/vote.rb:

after_save :update_post

  def up_vote?
    value == 1
  end

  def down_vote?
    value == -1
  end

  def update_post
    post.update_rank
  end

我有 运行 "heroku rn db:migrate" 和 "heroku restart" 但错误仍然存​​在。我的 rails 版本是 4.2.0,我的 Ruby 版本是 2.0.0.

有谁知道原因是什么以及如何让它在 Heroku 上运行?

所提供代码中唯一使用“-”的地方是 Post#update_rank

的第一行

注意,当我运行下面的irb

irb> (nil - Time.new(1970,1,1)) / (60  * 60 * 24) 

我收到以下错误。

NoMethodError: undefined method `-' for nil:NilClass

记住Ruby中的一切class。许多 classes 实现了运算符方法。 DateTime class 有,但 NilClass 没有。

我怀疑您的 created_at 尚未设置,此时为 nil 值。