Rails 生产中缺少方法?

Rails Method missing in production?

我刚刚将 dev/test 中的一些新功能移植到 heroku 产品中。我已经实现了通过 parent_id.

让微博模型自连接来向微博添加评论的可能性

在 dev 中,当我在 dev 中使用该功能时,它工作正常,控制台为生产显示以下内容:

2015-10-24T17:59:54.974585+00:00 app[web.1]: Started POST "/microposts" for 91.35.226.128 at 2015-10-24 17:59:54 +0000
2015-10-24T17:59:54.979271+00:00 app[web.1]:   Car Load (1.0ms)  SELECT  "cars".* FROM "cars" WHERE "cars"."id" =  LIMIT 1  [["id", 1]]
2015-10-24T17:59:54.981868+00:00 app[web.1]: 
2015-10-24T17:59:54.981869+00:00 app[web.1]: NoMethodError (undefined method `parent_id=' for #<Micropost:0x007f9f3036b290>):
2015-10-24T17:59:54.981870+00:00 app[web.1]:   app/controllers/microposts_controller.rb:11:in `create'
2015-10-24T17:59:54.981871+00:00 app[web.1]: 
2015-10-24T17:59:54.981871+00:00 app[web.1]: 
2015-10-24T17:59:54.976228+00:00 app[web.1]:   Parameters: {"utf8"=>"✓", "authenticity_token"=>"*", "micropost"=>{"content"=>"Oooooder???"}, "parent_id"=>"37", "car_id"=>"2"}

它抱怨的相应代码是这里的最后一行:

  def create
    @micropost = current_users_car.microposts.build(micropost_params)
    if !params[:id].nil?
    @micropost.car_id = params[:id]
    end
    @micropost.user_id = current_user.id
    @micropost.parent_id = params[:parent_id]

由于上面的行有效,我认为@micropost 不为零。 我已经尝试在 heroku 控制台中玩耍并创建一个 micropost 对象并设置并获取 parent_id 它工作得很好。 那么这里有什么问题呢?我迷路了:(

由于它在生产环境中的控制台中运行,因此这些更改肯定会进入生产环境。这可能意味着 rails 应用程序需要重新启动。

heroku restart -a app_name

为什么我的应用程序必须重新启动?

您可能已经注意到,有时当您将代码推送到生产环境并且从未重新启动服务时,事情仍然有效!那是因为 rails 有一个 autoload feature that reloads certain code automatically. However it only reloads under certain conditions.

this article 中(虽然有点过时),解释了重新加载及其工作原理。

在这种情况下,在更新架构时,代码不会自动重新加载,因此必须手动重新启动服务器。

建议

部署时,总是运行迁移并重启服务器。你会避免这样的情况。

关于 Heroku 的一些小技巧

将应用程序投入生产(或暂存)后立即执行的操作

  1. 保证好css,运行RAILS_ENV=production bundle exec rake assets:precompile

  2. 在你的push之后,总是运行heroku run rake db:migrate

  3. 现在,重置你的服务器heroku restart

  4. css有问题? heroku run RAILS_ENV=production bundle exec rake assets:precompile

希望对您有所帮助! :)