我是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上运行?
答案 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尚未设置,此时为零值。