web-dev-qa-db-ja.com

require_tree引数は、Rails 5アップグレードされたアプリのディレクトリでなければなりません

アプリをRails 4.2.7からRails 5.0.0.1にアップグレードしました。私は RailsDiff を使用して、すべてがカバーされていることを確認しました。これまでのところ、私のアプリをロードするまではすべてうまくいきました。

今、私はこのエラーを見ています:

Sprockets::ArgumentError at /
require_tree argument must be a directory

これは私のapplication.cssです:

/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
 * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the bottom of the
 * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
 * files in this directory. Styles in this file should be added after the last require_* statement.
 * It is generally better to create a new file per style scope. *
 *= require_tree .
 *= require_self
 */

これは私のapplication.jsです

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file. JavaScript code in this file should be added after the last require_* statement.
//
// Read Sprockets README (https://github.com/Rails/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .

サーバーログは次のようになります。

Started GET "/" for ::1 at 2016-09-02 09:08:19 -0500
  ActiveRecord::SchemaMigration Load (1.5ms)  SELECT "schema_migrations".* FROM "schema_migrations"
  User Load (1.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 2], ["LIMIT", 1]]
Processing by ProfilesController#index as HTML
  Rendering profiles/index.html.erb within layouts/application
  Profile Load (1.6ms)  SELECT "profiles".* FROM "profiles"
  Rendered profiles/index.html.erb within layouts/application (45.8ms)
Completed 500 Internal Server Error in 367ms (ActiveRecord: 6.3ms)


DEPRECATION WARNING: #original_exception is deprecated. Use #cause instead. (called from initialize at /.rvm/gems/Ruby-2.3.1@myapp/gems/better_errors-2.1.1/lib/better_errors/raised_exception.rb:7)
DEPRECATION WARNING: #original_exception is deprecated. Use #cause instead. (called from initialize at /.rvm/gems/Ruby-2.3.1myapp/gems/better_errors-2.1.1/lib/better_errors/raised_exception.rb:8)

Sprockets::ArgumentError - require_tree argument must be a directory:
  sprockets (3.7.0) lib/sprockets/directive_processor.rb:182:in `rescue in block in process_directives'
  sprockets (3.7.0) lib/sprockets/directive_processor.rb:179:in `block in process_directives'
  sprockets (3.7.0) lib/sprockets/directive_processor.rb:178:in `process_directives'

プラグインを使用していません。かなりシンプルな/バニラアプリです。唯一のスタイル設定は、デフォルトのscaffold.scssからのものです。

何が原因でしょうか?

27
marcamillion

ようやくわかりました。だから私はアップグレードをしているので、RailsDiffは何かが足りないことを教えてくれませんでした。

そのため、エラーメッセージは正しくありましたが、私が忘れていたのは、空のディレクトリを作成することでした。

私のapp/assets/javascripts/cable.jsには、次のものが含まれていました。

//= require_tree ./channels

しかし、そのフォルダを実際に作成するのを忘れていました。

これを修正するには、app/assets/javascripts内にchannelsという空のフォルダーを作成するだけで済みました。また、gitは新しく作成されたフォルダー内の空のディレクトリを無視するため、.keepという空のファイルも作成する必要がありました。

したがって、以下を実行すると、すべてが魅力的に機能しました。

  • フォルダを作成:app/assets/javascripts/channels
  • そのフォルダー内に空のファイルを作成します:app/assets/javascripts/channels/.keep

すべてが今完璧に動作します。

52
marcamillion

この問題はRails new appname --skip-keepsフラグを使用すると発生します-それでも存在しないファイルを要求しようとしますが、通常はRailsチーム側の間違いです)。

これは、上記の問題に対する別のアプローチであり、メインのソリューションは完全に機能します。

  1. app/assets/javascripts/cable.jsを開く
  2. 自動生成された//= require_tree ./channelsを6行目から削除します

コードベースをできるだけ小さくしてください。誰かが.keepsを理由でスキップしました。

2
wscourge

同様の問題に直面しましたが、同じ問題にはなりませんでした。 Rails 5.2.3から5.2.4.1へのアップグレード中

_$ Rails s_が返されました:

_Expected to find a manifest file in `app/assets/config/manifest.js` (Sprockets::Railtie::ManifestNeededError)
But did not, please create this file and use it to link any assets that need to be rendered by your app:

Example:
  //= link_tree ../images
  //= link_directory ../javascripts .js
  //= link_directory ../stylesheets .css
and restart your server
_

わかりました、指示に従って、上記の内容で_manifest.js_を作成し、次に

_$ Rails s_が返されました:

_Sprockets::ArgumentError at / link_tree argument must be a directory
_

修正:

新しいimagesフォルダーに空の_.keep_ファイルを作成します(これは、過去のある時点で削除された可能性があり、直接の影響はありません)。

_app/assets/images/.keep_

1
Arta