2015-04-01 40 views
0

我是Ruby新手,現在在將應用程序部署到Heroku後遇到錯誤。應用程序在Localhost上正常工作,但在Heroku上有NoMethodError(undefined方法` - '爲零:NilClass)Heroku

我在本地主機上測試我的應用程序,一切工作正常;然而,當我嘗試保存一篇新文章時,Heroku上的「nil:NilClass」有「未定義方法 - 」。我在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方法

從我的應用程序/模型/ 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 

從應用/控制器/主題/ 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 

我已經運行「heroku rn db:migrate」和「heroku restart」,但是錯誤依然存在。我的rails版本是4.2.0,我的Ruby版本是2.0.0。

有誰知道是什麼原因以及如何使它在Heroku上工作?

+0

update_post在哪裏被調用? – 2015-04-01 06:05:26

+0

@Antarr Byrd:after_save:update_post在models/vote.rb中,我也在我的問題中加入了它,謝謝! – 2015-04-01 06:12:36

回答

1

唯一使用「 - 」中提供的代碼是第一線的帖子#update_rank

注意,當我運行在IRB

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

我收到以下錯誤以下。

NoMethodError: undefined method `-' for nil:NilClass 

在Ruby中記住所有的一類。許多類實現了操作符方法。 DateTime類可以,但NilClass不會。

我懷疑你的created_at還沒有設置,在這一點上是零值。

+0

感謝您的回答! created_at位於db/schema.rb中: {create_table「posts」,force::cascade do | t | t.string「title」 t.text「body」 t.datetime「created_at」} 不知道我是否遺漏了任何東西。 – 2015-04-01 06:40:57

+0

當對象成功保存到數據庫時,Rails設置created_at。你有沒有定義任何驗證器可能導致後期保存失敗? – 2015-04-01 06:50:19

+0

我只是在我的問題中添加了驗證器,但它似乎沒有與「created_at」問題給我。 – 2015-04-01 19:04:14

相關問題