【问题标题】:Rails Method missing in production?生产中缺少Rails方法?
【发布时间】:2015-10-24 18:11:09
【问题描述】:

我刚刚将一些新功能从我的开发/测试交付到 heroku 生产。我已经实现了通过让 micropost 模型通过 parent_id 自加入来将 cmets 添加到 microposts 的可能性。

在 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" = $1 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 它工作得很好。 那么这里有什么问题呢?我迷路了:(

【问题讨论】:

  • 你跑heroku run rake db:migrate了吗?
  • 是的,这样做了 - 两次甚至检查!
  • 这似乎是一个愚蠢的问题,但由于控制台工作正常,您是否重新启动了网络应用程序?
  • 不,我想我没有? Heroku 不会自动执行此操作吗?到目前为止,我认为我从未这样做过?
  • 试试heroku restart -a app_name。如果它仍然不起作用,那么您至少会消除另一个选项来说明原因;​​)

标签: ruby-on-rails ruby-on-rails-4 heroku production


【解决方案1】:

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

heroku restart -a app_name

为什么我的应用必须重启?

您可能已经注意到,有时当您将代码推送到生产环境并且从未重新启动服务时,事情仍然有效!那是因为 rails 有一个 autoload feature 可以自动重新加载某些代码。 但是它只会在certain conditions 下重新加载。

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

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

建议

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

【讨论】:

    【解决方案2】:

    关于 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

    希望对你有帮助! :)

    【讨论】:

      猜你喜欢
      • 2014-07-06
      • 2015-07-12
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 2017-04-08
      • 2012-02-11
      相关资源
      最近更新 更多