assetsフォルダの画像とpublicフォルダの画像とセレクタの部分一致

assetsフォルダの画像とpublicフォルダの画像とセレクタの部分一致

rspecを記述している時に、画像の表示をテストする際にsrc属性の値をチェックする際に少しハマった事があったので、こちらにまとめます。

・[public]フォルダに画像を保存した時
[public]フォルダに画像を保存すると、通常は以下のようなHTMLになる。
[public/default.jpg]に画像を保存した場合

[htmlファイル]

<img src="/default.jpg"> ①

※ポイント

viewファイルに記載する時のパスは、以下のようになる。

[viewファイル]

= image_tag '/default.jpg'

ファイルのパスは、/から記載する。

ブラウザに表示されるhtmlのsrc属性は、①のようにファイル名がそのまま表示される。

・[assets/images]フォルダに画像を保存した時 [assets/images]フォルダに画像を保存すると、通常は以下のようなHTMLになる。
[assets/images]に画像を保存した場合

[htmlファイル]

<img src="/assets/cooking_memory/default-c11415b5b99233bc64bbedd7a2d6870611196c7bcd9b5a4bfe8dcd5ece0ade65.jpg"> ②

※ポイント

viewファイルに記載する時のパスは、以下のようになる。

[viewファイル]

= image_tag 'default.png'

/から記載せずにそのままパスを記載する。

ブラウザに表示されるhtmlのsrc属性は、②のようにファイル名がハッシュになっている。

RSpecのテスト時
RSpecで画像の表示をテストする場合は、以下のようになる。

・[public]フォルダに画像が保存されている時

[specファイル]

expect(page).to have_selector("img[src$='default.jpg']")

$を記載する事で、属性の値がdefault.jpgで終わるものになる

・[assets/images]フォルダに画像が保存されている時

[specファイル]

expect(page).to have_selector("img[src*='default.jpg']")

*を記載する事で、属性の値にdefault.jpgを含むもの

※ポイント
セレクタの部分一致

前方一致 E[foo^="bar"] foo属性の値がbarで始まるE要素

後方一致 E[foo$="bar"] foo属性の値がbarで終わるE要素

部分一致 E[foo*="bar"] foo属性の値にbarを含むE要素

アプリが元々保持する画像は、[app/assets/images]フォルダに保存するのが推奨!!

参考記事

セレクタの部分一致について - Qiita