应用程序在Localhost上正常工作,但在Heroku上有NoMethodError(未定义的方法` - '代表nil:NilClass)

时间:2015-04-01 04:38:15

标签: ruby-on-rails ruby heroku

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

我在localhost上测试我的应用程序,一切正常;但是,当我尝试保存一个新帖子时,我有一个未定义的方法` - '为零:NilClass"在Heroku上。我在StackOverflow上搜索了解决方案,但到目前为止我还没找到任何东西。

我从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

模型/ 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

我已经运行&#34; heroku rn db:migrate&#34;和&#34; heroku重启&#34;但错误仍然存​​在。我的rails版本是4.2.0,我的Ruby版本是2.0.0。

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

1 个答案:

答案 0 :(得分:1)

&#34; - &#34;的唯一用途在提供的代码中位于 Post#update_rank

的第一行

注意,当我在irb

中运行以下内容时
irb> (nil - Time.new(1970,1,1)) / (60  * 60 * 24) 

我收到以下错误。

NoMethodError: undefined method `-' for nil:NilClass

记住Ruby中的所有内容。许多类实现了运算符方法。 DateTime类可以,但NilClass没有。

我怀疑你的created_at尚未设置,此时为零值。