前提・実現したいこと
Ruby on railsで画像が投稿できるようなシステムを作っています。
画像を背景に表示させたい。
発生している問題・エラーメッセージ
active storageに投稿した画像を保存し表示できるように出来ました。
その後、AWSのS3に投稿して画像を保存して表示させようとすると、エラーが発生し、
HTMLの記述を修正しました。
画像データがレコードには正常に送られているのがわかるのですが、
画像が表示されず困っています。
_item.html.erbの画像を表示させるコードに問題があると思います。
該当のソースコード
Ruby
1app/veiws/veiws/_item.html.erb 2 3<code> 4 5➡︎このコードだと画像が表示されない<div class="content_post" style="background-image: url(<%= image_tag item.image %>) ;"> 6➡︎このコードだとエラーが発生<%# <div class="content_post" style="background-image: url(<%= Rails.application.routes.url_helpers.url_for(item.image) if item.image.attached? %> 7 8➡︎このコードだとエラーが発生(NoMethodError in Users#show)<div class="content_post" style="background-image: url(<%= url_for(item.image.url)=%> 9 <div class="more"> 10 <span><%= image_tag 'arrow_top.png'%></span> 11 <ul class="more_list"> 12 <li> 13 <%= link_to '詳細', item_path(item.id), method: :get%> 14 </li> 15 <% if user_signed_in? && current_user.id == item.user_id %> 16 <li> 17 <%= link_to '削除', item_path(item.id), method: :delete %> 18 </li> 19 <%# Prefixの引数 %> 20 <%# アイテムのID(item.id) %> 21 <%# HTTPメソッドは、DELETEというHTTPメソッド %> 22 <%# methodオプションにシンボルで:delete %> 23 <li> 24 <%= link_to '編集',edit_item_path(item.id), method: :get %> 25 <%# get サーバーからブラウザに情報を返す。単にウェブサイトを閲覧する際など、情報を取得するために利用される。 %> 26 <%# Prefixでパスを確認 %> 27 </li> 28 <% end %> 29 </ul> 30 </div> 31 <p><%= item.text %></p> 32 <span class="name"> 33 <a href="/users/<%= item.user.id %>"> 34 <span>投稿者</span><%= item.user.nickname %> 35 </a> 36 </span> 37 </div> 38> 39
➡︎エラー内容
NoMethodError in Users#show Showing /Users/uraokayuutarou/projects/nostalgia/app/views/items/_item.html.erb where line #1 raised: undefined method `url' for #<ActiveStorage::Attached::One:0x00007fc948e1ff28> Extracted source (around line #1): <div class="content_post" style="background-image: url(<%= url_for(item.image.url)=%> <%= image_tag item.image.variant(resize: '500x500'), class: 'item-image' if item.image.attached? %> <%= image_tag message.image, class: 'message-image' if message.image.attached? %> Trace of template inclusion: #<ActionView::Template app/views/users/show.html.erb locals=[]> Rails.root: /Users/uraokayuutarou/projects/nostalgia Application Trace | Framework Trace | Full Trace app/views/items/_item.html.erb:1 app/views/users/show.html.erb:4 app/views/users/show.html.erb:3 Request Parameters:
https://gyazo.com/17411c4b60fe029ecbe7f89f2b7156e2
試したこと
app/veiws/veiws/_item.html.erb <code> 上記修正後のコード()の中身 <div class="content_post" style="background-image: url(<%= image_tag item.image %>) ;"> 画像が表示されず、エラーなし <div class="content_post" style="background-image: url(<%= image_url item.image %>) ;"> ➡︎1パターン目image_urlを使った場合 Sprockets::Rails::Helper::AssetNotFound in Items#index Showing /Users/uraokayuutarou/projects/nostalgia/app/views/items/_item.html.erb where line #1 raised: The asset "" is not present in the asset pipeline. Extracted source (around line #1): <div class="content_post" style="background-image: url(<%= image_url item.image %>) ;"> <%# <div class="content_post" style="background-image: url(<%= Rails.application.routes.url_helpers.url_for(item.image) if item.image.attached? %> <%# <%= image_tag item.image ,class: 'item-image' if item.image.attached? %> <%# <%= image_tag message.image, class: 'message-image' if message.image.attached? %> <%# attached?メソッド レコードにファイルが添付されているかどうか モデル.ファイル名.attached? %> <%# image_tagメソッド img要素を生成するRailsのヘルパーメソッド %> Trace of template inclusion: #<ActionView::Template app/views/items/index.html.erb locals=[]> Rails.root: /Users/uraokayuutarou/projects/nostalgia Application Trace | Framework Trace | Full Trace app/views/items/_item.html.erb:1 app/views/items/index.html.erb:7 app/views/items/index.html.erb:6:in `each' app/views/items/index.html.erb:6 ➡︎2パターン目image_pathを使った場合 Sprockets::Rails::Helper::AssetNotFound in Items#index Showing /Users/uraokayuutarou/projects/nostalgia/app/views/items/_item.html.erb where line #1 raised: The asset "" is not present in the asset pipeline. Extracted source (around line #1): <div class="content_post" style="background-image: url(<%= image_path item.image %>) ;"> <%# <div class="content_post" style="background-image: url(<%= Rails.application.routes.url_helpers.url_for(item.image) if item.image.attached? %> Trace of template inclusion: #<ActionView::Template app/views/items/index.html.erb locals=[]> Rails.root: /Users/uraokayuutarou/projects/nostalgia Application Trace | Framework Trace | Full Trace app/views/items/_item.html.erb:1 app/views/items/index.html.erb:7 app/views/items/index.html.erb:6:in `each' app/views/items/index.html.erb:6 ➡︎3パターン目をitem.image.path使った場合 NoMethodError in Items#index Showing /Users/uraokayuutarou/projects/nostalgia/app/views/items/_item.html.erb where line #1 raised: undefined method `path' for #<ActiveStorage::Attached::One:0x00007fee7e66ff70> Extracted source (around line #1): <div class="content_post" style="background-image: url(<%= item.image.path %>) ;"> <%# <div class="content_post" style="background-image: url(<%= Rails.application.routes.url_helpers.url_for(item.image) if item.image.attached? %> <%# <%= image_tag item.image ,class: 'item-image' if item.image.attached? %> <%# <%= image_tag message.image, class: 'message-image' if message.image.attached? %> <%# attached?メソッド レコードにファイルが添付されているかどうか モデル.ファイル名.attached? %> <%# image_tagメソッド img要素を生成するRailsのヘルパーメソッド %> Trace of template inclusion: #<ActionView::Template app/views/items/index.html.erb locals=[]> Rails.root: /Users/uraokayuutarou/projects/nostalgia Application Trace | Framework Trace | Full Trace app/views/items/_item.html.erb:1 app/views/items/index.html.erb:7 app/views/items/index.html.erb:6:in `each' app/views/items/index.html.erb:6 ➡︎4パターン目をitem.image.url使った場合 NoMethodError in Items#index Showing /Users/uraokayuutarou/projects/nostalgia/app/views/items/_item.html.erb where line #1 raised: undefined method `url' for #<ActiveStorage::Attached::One:0x00007fee7f6197c8> Extracted source (around line #1): <div class="content_post" style="background-image: url(<%= item.image.url %>) ;"> <%# <div class="content_post" style="background-image: url(<%= Rails.application.routes.url_helpers.url_for(item.image) if item.image.attached? %> Trace of template inclusion: #<ActionView::Template app/views/items/index.html.erb locals=[]> Rails.root: /Users/uraokayuutarou/projects/nostalgia Application Trace | Framework Trace | Full Trace app/views/items/_item.html.erb:1 app/views/items/index.html.erb:7 app/views/items/index.html.erb:6:in `each' app/views/items/index.html.erb:6 ➡︎5パターン目@item.image.urlを使った場合 NoMethodError in Items#index Showing /Users/uraokayuutarou/projects/nostalgia/app/views/items/_item.html.erb where line #1 raised: undefined method `image' for nil:NilClass Extracted source (around line #1): <div class="content_post" style="background-image: url(' <%= image_tag(@item.image.url) %>') ;"> <%# <div class="content_post" style="background-image: url(<%= Rails.application.routes.url_helpers.url_for(item.image) if item.image.attached? %> Trace of template inclusion: #<ActionView::Template app/views/items/index.html.erb locals=[]> Rails.root: /Users/uraokayuutarou/projects/nostalgia Application Trace | Framework Trace | Full Trace app/views/items/_item.html.erb:1 app/views/items/index.html.erb:7 app/views/items/index.html.erb:6:in `each' app/views/items/index.html.erb:6 ➡︎6パターン目<div class="content_post" style="background-image: url(<%= url_for(item.image) ,class: 'item-image' if item.image.attached? %> 上記のコードでエラーが発生しました。 エラースクリーンショット https://gyazo.com/f1fe843012299d2dc4ec19060bf82905 続き https://gyazo.com/e89d008392120fa0a804ff47f8a90bf3
補足
S3はバケットを作成して、バケットポリシーを編集、 Gemfieにgem "aws-sdk-s3", require: falseをbundle installしました。 その後config/enviroments/delopment.rbにconfig.active_storage.service = :amazonにlocalから変更。 次に「パブリックアクセスをすべてブロック」のチェックを外す。 新規のパブリックバケットポリシー,任意のバケットポリシーにチェックを入れました。 config/storage.ymlに追記 amazon: service: S3 access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %> secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %> region: ap-northeast-1 bucket: 自身のバケット名 環境設定 config/enviloment/developments.rb 最後の記述 # default_url_options[:host] = "localhost:3000" host = 'samplehost' Rails.application.routes.default_url_options[:host] = host #おそらく本番環境productionにも定義 ここを記載してlocalでは表示させることが出来ました。 url_forメソッドを使用して
追記11/6 20:42
1)S3にsaveできたというのは、WEBページのAWSのS3のオブジェクトで確認しました。
2)item_params の中身 => <ActionController::Parameters {"text"=>"パンツ", "image"=>#<ActionDispatch::Http::UploadedFile:0x00007fefc2b84c78 @tempfile=#Tempfile:/var/folders/qp/vfswzv852_x8zy3q27gp1gt00000gn/T/RackMultipart20201106-6566-1l80iav.png, @original_filename="スクリーンショット 2020-11-06 19.46.55.png", @content_type="image/png", @headers="Content-Disposition: form-data; name="item[image]"; filename="\xE3\x82\xB9\xE3\x82\xAF\xE3\x83\xAA\xE3\x83\xBC\xE3\x83\xB3\xE3\x82\xB7\xE3\x83\xA7\xE3\x83\x83\xE3\x83\x88 2020-11-06 19.46.55.png"\r\nContent-Type: image/png\r\n">, "user_id"=>1} permitted: true>
3)item modelの定義
params.require(:item).permit(:text, :image ).merge(user_id: current_user.id
回答1件
あなたの回答
tips
プレビュー