🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Ruby on Rails

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

948閲覧

RailsアプリAWS S3に非同期通信で画像アップロードできない。

hurousyotoku500

総合スコア27

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Ruby on Rails

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2021/02/24 05:36

現在の状況

railsにてアプリ制作中です。下記のリンク記事の手順通り、AWSへデプロイしました。それに伴い、画像のアップロードはS3にアップしようとしています。 (carrierwave使用)
https://qiita.com/take18k_tech/items/2efd778c8dd9aae9496e

画像投稿は、Userモデル(avater)とMessageモデル(image)に2箇所で行ってます。
2点で違う点は、
Userモデル(avaterカラム)はajaxを使用せず同期通信、
Messageモデル(imageカラム)はajaxを使用して非同期通信
になります。
(開発環境では問題なく動作しておりました。)

問題点

・Messageモデル(imageカラム)は投稿ボタンをクリックすると、POST https://sologol.work/messages 500がコンソールに表示され、画面は変化しません。DBにも保存されないため、画面を更新しても、表示されません。

bundle exec cap production deployすると、Userモデル(avaterカラム)が全て消えてしまう。
(↑関係あるか分かりませんが、一応記載しておきます)

試したこと

下記のリンクの記事の内容は全て試してみましたが、症状変わりませんでした。
https://qiita.com/siruku6/items/a3a9021913749247d92b

解決したいこと

・Messageモデル(imageカラム)も非同期で問題なく投稿したい。
・Userモデル(avaterカラム)は、デプロイしても消えないようにしたい。
ajaxを使用しないUserモデル(avaterカラム)は保存はできているので、大きな間違いはないかと思うものの、deployすると消えてしまうので、どこかおかしいかとは思っています。

Messageモデル(imageカラム)送信時のエラー文

I, [2021-02-23T21:27:20.322183 #8561] INFO -- : [d468c9ad-2d75-4683-a918-606c06214792] Started POST "/messages" for 122.222.130.5 at 2021-02-23 21:27:20 +0000 I, [2021-02-23T21:27:20.322967 #8561] INFO -- : [d468c9ad-2d75-4683-a918-606c06214792] Processing by MessagesController#create as JS I, [2021-02-23T21:27:20.323052 #8561] INFO -- : [d468c9ad-2d75-4683-a918-606c06214792] Parameters: {"authenticity_token"=>"sSMel+aT37uIJ71fjf6KubS/VEIo93AMLY2avvTM9wLgrO1YsAnN0hAoykJgLuLPOHL2aZtsIinJuxrp79GrgA==", "message"=>{"content"=>"", "image"=>#<ActionDispatch::Http::UploadedFile:0x00007f6b80c75b08 @tempfile=#<Tempfile:/tmp/RackMultipart20210223-8561-iag8bn.JPG>, @original_filename="IMG_9368.JPG", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"message[image]\"; filename=\"IMG_9368.JPG\"\r\nContent-Type: image/jpeg\r\n">}, "score_id"=>"1", "commit"=>"メッセージを送信する"} I, [2021-02-23T21:27:20.478504 #8561] INFO -- : [d468c9ad-2d75-4683-a918-606c06214792] Completed 500 Internal Server Error in 155ms (ActiveRecord: 0.0ms | Allocations: 12185) F, [2021-02-23T21:27:20.479145 #8561] FATAL -- : [d468c9ad-2d75-4683-a918-606c06214792] [d468c9ad-2d75-4683-a918-606c06214792] Excon::Error::Forbidden (Expected(200) <=> Actual(403 Forbidden) excon.error.response :body => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>ED1CF861B3139B93</RequestId><HostId>P7cJlJ1EsJXH2tjAEl2a3Rj2dQK7INZuIjZvDfXbYQBOjV45DZKIT2NiAgRK5NdZqjk6FqJnkk0=</HostId></Error>"

コード

ruby

1# app/controllers/messages_controller.rb 2 def create 3 @message = Message.new(message_params) 4 playing_course = Score.find(params[:score_id]) 5 golfcourse_id = playing_course.golfcourse_id 6 @message.golfcourse_id = golfcourse_id 7 @message.user_id = current_user.id 8 @message.save 9 end 10 11 private 12 13 def message_params 14 params.require(:message).permit(:content, :score_id, :image) 15 end
# app/views/messages/create.js.erb var message_content = document.getElementById( "message_content").value ; var message_length = message_content.length ; var message_image = document.getElementById( "message_image").value ; console.log(message_length) if (message_content == "" && message_image == ""){ console.log("どちらもからです。") alert('メッセージか画像、どちらかは入力して下さい。'); }else if(message_length > 100){ console.log(message_length); alert('メッセージは100文字以内でお願いします。'); }else{ document.getElementById('messages') .insertAdjacentHTML('afterbegin', '<p id="message-<%= @message.id %>" class="score-block__group">\ <% if @message.user.avatar? %>\ <%= image_tag asset_path(@message.user.avatar.url), class: "score-block__img"%>\ <% else %>\ <%= image_tag asset_path("ball.svg"), class: "score-block__img"%>\ <% end %>\ <span><%= link_to @message.user.name, users_show_path(id: @message.user.id) %></span>\ <% if @message.image != nil %>\ <%= image_tag asset_path("#{@message.image}"), class: "thmb" %>\ <% end %>\ <span class="score-block__date-content"><%= @message.content %></span>\ <span class="score-block__date-like">\ <span><%= @message.created_at %></span>\ <a id="unlike-<%= @message.id %>" href ="/messages/<%= params[:score_id] %>?message_id=<%= @message.id %>">0</a>\ <a id="change-like-<%= @message.id %>" data-remote="true" rel="nofollow" data-method="post" href="/likes?message_id=<%= @message.id %>&score_id=<%= params[:score_id] %>&user_id=<%= current_user.id %>">\♡\</a>\ </span>\ </p>'); document.getElementById('message_content').value = '' document.getElementById('message_image').value = '' }

情報不足かもしれません。必要な情報あれば、仰っていただければ、すぐに追記致します。
何卒宜しくお願い致します。

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

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

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

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

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

yu_1985

2021/02/25 04:36

Forbiddenになってますけど、使っているCredentialはアップロード先のバケットに対する書き込み権限はありますか? エラーメッセージの内容的に権限が足りなくてエラーになっている可能性が高いと思うのですが。 また、本件と関係ないですが、AWS上で動かすものであればアクセスキーを使わずIAMロールを使うことを推奨します。
hurousyotoku500

2021/02/26 03:59

ご回答ありがとうございます。権限のほうはconfig/credentials.yml.encにIAMユーザーのアクセスキーとIDを記述し、コンソールでは Rails.application.credentials.dig(:aws, :access_key_id) Rails.application.credentials.dig(:aws, :secret_access_key) で問題なく呼び出せてはいます。ただ、それは権限を確認する方法とは違いますか?権限を確認する方法があれば、そちらも教えていただきたく。また、IAMロールを使用するというものも、何かいい記事があれば、リンクを送っていただけないでしょうか?
yu_1985

2021/02/26 04:06

それはキーをRailsに設定しているかどうかの確認であって、キーが持っている権限の確認とは違います。 IAMロールを使用する場合は、キーや環境変数等で何もcredentialの情報を与えなければ自動的にIAMロールから権限を取得してその権限を使用します。 つまり、キーの情報を消して何も設定していない状態にすればOKです。 cliやほとんどのAWS関連のSDKではそのように権限を取得する仕様です。 もちろんそれにはIAMロールを設定済みである必要があります。 IAMロールを設定すること自体は何も難しくはなく、IAMロールを作成してEC2のコンソールから設定できます。 https://blog.serverworks.co.jp/tech/2020/01/20/iam-role-to-ec2/ いずれにせよ、IAMのコンソールで必要な権限が設定してあるかを確認してみてください。
guest

回答1

0

自己解決

恐らくですが、config/credentials.yml.encの記述ミスがあったのかと…今となっては分かりませんが。余計なインデントがあったのかもしれませんが、新たに書き直したら解決しました。

投稿2021/02/27 08:09

hurousyotoku500

総合スコア27

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問