7990


現在、awsにてrailsアプリケーションを運用しています  
１週間前まで正常にデプロイできていたのですが現在下記エラーが出てしまい、アプリケーションが正常に動かなくなってしまいました。

[code]

    ActionController::RoutingError (No route matches [GET] "/assets/application-c7d139e94d8335f8f955c35d6ec3c46d.js"):
      actionpack (4.1.7) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
      actionpack (4.1.7) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
      railties (4.1.7) lib/rails/rack/logger.rb:38:in `call_app'
      railties (4.1.7) lib/rails/rack/logger.rb:20:in `block in call'
      activesupport (4.1.7) lib/active_support/tagged_logging.rb:68:in `block in tagged'
      activesupport (4.1.7) lib/active_support/tagged_logging.rb:26:in `tagged'
      activesupport (4.1.7) lib/active_support/tagged_logging.rb:68:in `tagged'
      railties (4.1.7) lib/rails/rack/logger.rb:20:in `call'
      actionpack (4.1.7) lib/action_dispatch/middleware/request_id.rb:21:in `call'
      rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
      rack (1.5.2) lib/rack/runtime.rb:17:in `call'
      activesupport (4.1.7) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call'
      rack (1.5.2) lib/rack/lock.rb:17:in `call'
      rack (1.5.2) lib/rack/sendfile.rb:112:in `call'
      actionpack (4.1.7) lib/action_dispatch/middleware/ssl.rb:24:in `call'
      railties (4.1.7) lib/rails/engine.rb:514:in `call'
      railties (4.1.7) lib/rails/application.rb:144:in `call'
      unicorn (4.8.3) lib/unicorn/http_server.rb:576:in `process_client'
      unicorn (4.8.3) lib/unicorn/http_server.rb:670:in `worker_loop'
      unicorn (4.8.3) lib/unicorn/http_server.rb:525:in `spawn_missing_workers'
      unicorn (4.8.3) lib/unicorn/http_server.rb:140:in `start'
      unicorn (4.8.3) bin/unicorn_rails:209:in `<top (required)>'
      /home/deploy/.bundler/voteme/ruby/2.0.0/bin/unicorn_rails:23:in `load'
      /home/deploy/.bundler/voteme/ruby/2.0.0/bin/unicorn_rails:23:in `<main>'
    
[/code]

発生している直接の原因はassets:precompileで新しく生成されたapplication.jsと  
turbolinksでリンク付けされているapplication.jsのハッシュ値が不一致をおこしているためファイルが見つけられないという所です。

turbolinksが確認しているハッシュ値は前回のデプロイで使っていた値のままになっており  
assets:precompileを実行しても更新されませんでした。

解決のために行ったこととして  
1. config.serve_static_assetsの値をtrue/falseにかえてみて実行  
(当方nginxを使っているため正しい設定はfalseであることを把握しています)  
２. キャッシュの可能性を考えアプリケーション及びサーバーの再起動  
３. public/assets配下を全削除してassets:precompile打ち直し

しかしこれらでは解決出来ませんでした。

turbolinksでリンク付けされているapplication.jsのハッシュ値を変更する仕組みがいまいち理解できておらず、  
どうすれば更新できるのかが調べてもわかりませんでした。  
もしご存知の方がおられましたらご教授頂けませんでしょうか？  
もしくは考えられる原因は何があるかアドバイス頂けますと助かります。  
お手数ですがどうぞ宜しくお願い致します。


CC BY-SA 3.0
2015-03-16T04:50:33.683
7963
2021-08-14T05:30:29.293
2021-08-14T05:30:29.293
19110
8847
question
ruby-on-rails
railsのturbolinksでリンク付けされているapplicationのhash値が更新されない


> application.jsのハッシュ値を変更する仕組みがいまいち理解できておらず、どうすれば更新できるのかが調べてもわかりませんでした。

僕も詳しい仕組みがよくわかっていなかったので、勉強を兼ねてローカルのRailsアプリをproductionモードで動かしながら確認してみました。

`application.js`や`application.css`のdigest（ハッシュ値）は以下のファイルで定義されているようです。

`(Rails.root)/public/assets/manifest-(ランダムな文字列).json`

このファイルの中身はこのようになっています。

[code]

    {
      "files":{
        "application-4fba09a36c46587a0f07211966615115.js":{
          "logical_path":"application.js",
          "mtime":"2015-03-17T05:39:12+09:00",
          "size":116616,
          "digest":"4fba09a36c46587a0f07211966615115"
        },
        "application-3942007d31710307dd44000cb1f768c9.css":{
          "logical_path":"application.css",
          "mtime":"2015-03-17T05:39:12+09:00",
          "size":811,
          "digest":"3942007d31710307dd44000cb1f768c9"
        }
      },
      "assets":{
        "application.js":"application-4fba09a36c46587a0f07211966615115.js",
        "application.css":"application-3942007d31710307dd44000cb1f768c9.css"
      }
    }
    
[/code]

Rails起動時に上記ファイルが読み込まれ、`Sprockets::Manifest`というクラスに格納されます。

続いて、Viewで以下のようなコードを書いているとします。

[code]

    <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
    
[/code]

すると、`Sprockets::Rails::Helper#asset_digest_path`メソッド内で、`"application.js"`をキーとしてdigest付きのファイル名をルックアップします。

![画像の説明をここに入力](https://i.stack.imgur.com/fZAHm.png)

これでHTML側に出力されるファイルのパスが確定します。

[code]

    <script data-turbolinks-track="true" src="/assets/application-4fba09a36c46587a0f07211966615115.js"></script>
    
[/code]

というわけで、digestが一致しないと言うことは、何らかの原因で `manifest-xxx.json`
内のファイル名と実際のファイル名が一致していないんだと思われます。  
まずは `manifest-xxx.json` の内容がどうなっているか確認してみるといいんじゃないでしょうか。

ちなみにRails起動時に `manifest-xxx.json` を読み込む処理はこのあたりです。

  * <https://github.com/rails/sprockets-rails/blob/2.x/lib/sprockets/railtie.rb#L120>
  * <https://github.com/sstephenson/sprockets/blob/2.x/lib/sprockets/manifest.rb#L47>

また、`rake assets:precompile` でCSSやJSをプリコンパイルしたり、`manifest-
xxx.json`を書き換えているのはこのあたりです。

  * <https://github.com/sstephenson/sprockets/blob/2.x/lib/sprockets/manifest.rb#L110>

`manifest-xxx.json` の読み込みや内容がおかしい場合はこういった部分も確認してみてください。

### 余談

今回の調査ではRubyMineのデバッグ実行が大活躍しました。  
有料のIDEですが、Railsやgemのコードを追いかけて理解するのには大変便利です！

<https://www.jetbrains.com/ruby/>


CC BY-SA 3.0
2015-03-16T21:59:33.327
7990
2015-03-16T22:35:45.927
2015-03-16T22:35:45.927
85
85
7963
answer