我的控制器中有以下方法:
@featured_topics = Topic.find_all_by_featured(true)
它在本地工作正常,但是当我将我的网站上传到Heroku时,它失败了,我得到了NoMethodError。 “精选”是一个新专栏,但我上传了必要的文件并在Heroku上运行了rake db:migrate。为什么它不适用于Heroku?该网站的其余部分仍然有效。
答案 0 :(得分:4)
这里的问题是一个微妙的问题,只有当您的应用处于生产模式时(即ENV['RAILS_ENV']
或ENV['RACK_ENV']
= production
),这是Heroku的默认配置。
当Rails应用程序处于production
模式时,它不会在每个请求上重新加载类定义(就像您在本地运行的development
模式一样)。模型的类定义的一部分是在加载类时从数据库列中提取的属性。因此,如果您在production
中加载一个类,然后更改数据库,加载的类将不知道数据库已更改,您将获得新列的NoMethodError
。
要了解在Heroku案件中如何发生这种情况,请考虑以下顺序:
Topic.find_all_by_featured
列引用部署了应用
featured
列)heroku run bundle exec rake db:migrate
featured
列避免这种情况的正确顺序是为部署和数据库迁移启用维护模式:
$ heroku maintenance:on
$ git push heroku master
$ heroku run bundle exec rake db:migrate
$ heroku maintenance:off
部署和迁移时打开维护可确保应用程序不处理任何请求,并且不会加载任何类(具有不正确的列列表)。只有在db处于正确状态后才允许请求。