質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

4099閲覧

javascript 内で画像参照 404 エラー

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/12/11 04:50

編集2018/12/11 06:52

leaflet というライブラリを
vendor/assets/ 以下において
app/assets/application.js から require で呼び出しているのですが
chrome の開発ツールで

application-515d418457adc5a498c8d8ab9bc49944aef2885fab515db513ae693edef64790.js:2 GET http://localhost:3000/assets/images/spritesheet.svg 404 (Not Found)

というエラーが出ます

プリコンパイルされている
application-515d418457adc5a498c8d8ab9bc49944aef2885fab515db513ae693edef64790.js
中を文字列検索しても spritesheet.svg はヒットせず
リポジトリ内の spritesheet.svg という文字列で検索しても CSS しかヒットしません
CSS 内ではすべて url('images/spritesheet.png'); という形式でヒットします
JSから参照エラーが出る理由がわからなくて困っています

Production 環境でしか発生しないためミニマイズされたソースを読み解くのも大変で
ミニマイズされているソースのどの箇所が画像を参照しているか調べる方法はないでしょうか

追記:

vendor/assets/leaflet/ 以下に leaflet 関連の JS CSS を配置

MarkerCluster.Default.css leaflet-search.js leaflet-src.esm.js leaflet.draw.css leaflet.markercluster.js MarkerCluster.css leaflet-search.min.css leaflet-src.esm.js.map leaflet.draw.js leaflet.markercluster.js.map easy-button.css leaflet-search.min.js leaflet-src.js leaflet.js easy-button.js leaflet-search.mobile.min.css leaflet-src.js.map leaflet.js.map images leaflet-search.mobile.src.css leaflet.css leaflet.markercluster-src.js leaflet-search.css leaflet-search.src.css leaflet.draw-src.css leaflet.markercluster-src.js.map

vendor/assets/leaflet/images/ に png svg 等を配置

layers-2x.png layers.png marker-icon-2x.png marker-icon.png marker-shadow.png spritesheet-2x.png spritesheet.png spritesheet.svg

app/assets/javascripts/application.js で

//= require leaflet //= require easy-button //= require leaflet.draw //= require leaflet.markercluster-src

app/assets/stylesheets/application.css で

//= require leaflet //= require leaflet.draw //= require leaflet-search //= require easy-button //= require MarkerCluster.Default //= require MarkerCluster

leaflet のバージョンは最新の 1.3.4
ほかライブラリも 11 月初旬の時点で最新のもの

追記:

Rails4のProduction環境でのAsset Pipelineで躓いたので検証した

根本的な原因はこれと同じ現象な気がします

JS から画像エラーが出る理由は謎のままですが
CSS の url('images/spritesheet.png') が原因であるとすると

assets 内から require してしまうと assets/application.css に統合されて
その中で images/* をよぶので assets/images/* を参照にいってしまう

public/assets/ はデプロイ時に消去されるので前持っておいておくこともできない

プリコンパイルに画像ファイルをまぜてもサフィックスが付いて名前が変わってしまう

なのでそのサイトのように public 直下の絶対パスに書き換えるか
サフィックスのつかないプリコンパイラをいれるしかない?

Rails ガイドが推奨してる
「外部ライブラリは vendor/assets におく」
というのがそもそもよくないんでしょうか…

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/12/11 04:51

sprite.svgではなくspritesheet.svg では?
退会済みユーザー

退会済みユーザー

2018/12/11 04:56 編集

すみません記述ミスです 検索はspriteという文字でやってました
退会済みユーザー

退会済みユーザー

2018/12/11 05:19

表示されます なのでどこがこのURLを作ってるかを知りたいです
m.ts10806

2018/12/11 05:33

出ているエラーからするとapplication.jsの記述から出ているように思うのですがその観点からはいかがでしょうか?cssに指定されている画像ファイルが存在しない場合もNot Foundは出ますしjsからcssを参照しにいっていっているだけのようにも思います。Qiitaなどの記事を読んだ感じでは指定のディレクトリに各ファイルを配置してapplication.jsとapplication.cssにrequireを書けば使えるようなので本体のファイルを直接さわる必要はなさそうに思います
退会済みユーザー

退会済みユーザー

2018/12/11 05:46 編集

application.jsの記述から出ているというのはどういう意味でしょうか? require してるファイルの中身が全部1行のミニマイズされてしまっていて2行目とかかれていてもどこか特定するのが難しい状況で… >指定のディレクトリに各ファイルを配置して public/assets においた場合デプロイ時に1度削除されてしまいます app/assets においた場合プリコンパイルでハッシュがついてしまうので CSS の固定ファイル名ではアクセスできなくなります… なのでアクセスしてる側のパスを変更するしかないと思って そもそもだれが assets/ ってパスを付与しているかがわかれば原因がわかるかなと思ったのですが
m.ts10806

2018/12/11 06:02

誰も付与してなくて、相対パスだからだと思います。きちんと置いて読み込ませれば作動するものと思います。 >そもそもだれが assets/ ってパスを付与しているか
m.ts10806

2018/12/11 06:03

leaflet の導入手順と実際のディレクトリ構成(関係ファイルの配置)を提示されると回答のためのヒントになるかもしれません。
m.ts10806

2018/12/11 06:06

leaflet のバージョンもあわせてご提示いただければと。
guest

回答2

0

「手順」部分ですがこちらの記事も参考にしてみてください。

特にこのあたり、配置ですが、質問者さんが置かれた状況と違うようです。

leaflet.js => /vendor/assets/javascripts

leaflet.css => /vendor/assets/stylesheets
Imageについては/vendor/assets/にimagesディレクトリを作成し、中身を移動する。

※Ruby環境が手元にあるわけではないので既存の記事との比較のみです。試してみてできないようでしたらすみません。

投稿2018/12/11 07:09

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/11 07:15

L.Icon.Default.imagePath = "/assets"; なんていう設定が leaflet についているんですね… これを使えばできそうです ありがとうございました
m.ts10806

2018/12/11 07:16

解決に繋がりそうで何よりです
退会済みユーザー

退会済みユーザー

2018/12/11 09:37

んー すみません やはりJSが直接assets付きのパスをさわりにいってるみたいで… L.Icon.Default.imagePath をつけても CSS の URL を全部変更してみたのですが直らなかったです
guest

0

ベストアンサー

「404を出しているJSの場所を調べたい」という質問意図とは異なるのですが
結局そのサイトにある
non-stupid-digest-assets
を使って画像自体を assets 内にいれてファイル名をそのまま public/assets 内に生成する
という方法で404エラー自体は解決はしました

標準で推奨されている方法が
外部ジェムに頼らないと実現できないのは釈然としないですが…

投稿2018/12/13 03:29

編集2018/12/13 03:32
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/12/13 03:31

>標準で推奨されている方法が 外部ジェムに頼らないと実現できないのは釈然としないですが… そのあたりはRailsというフレームワークに載せる以上は仕方のないことなのかなと思います。 規約なりルールなり則る必要がありますからね…。なるべく管理下でやりたいでしょうし。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問