应用程序在本地主机上运行良好,但在 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 值。
我是 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 值。