#1.エラーの発見の経緯とエラーの様子
画像の保存の可否を検証ツールで確認していたところコンソールの部分に下記のような記載が出てきました
#2.原因の究明の経緯(方法)
データの保存は正しく行われているのになぜかエラーを出しており、とりあえずエラーの右側にあるurlをクリックすると、これまたなぜか使用どころか引用した覚えすらないajaxの引用文の箇所にエラー表示が飛ばされてしまい、これまで多くの人の目にさらされているソースが間違っていると表示されてしまいました。
そのコードが間違っているというのは流石におかしいと考え、このエラーに関する記事を探っていったところ、500エラーとはサーバー側のエラーであるという下記の記事を見かけました。
サーバー側のエラーであることと、この時筆者はローカルでしか開発を行っていなかったことから、railsの起動のログを確認することとしました
するとログの中に下記のような記載があり、エラーがルーティングによるものだと分かりました。
# rails s したターミナルの画面
〜前略〜
[ActiveJob] Enqueued ActiveStorage::AnalyzeJob (Job ID: 88ca34c8-6291-4523-9bdc-8cb722868aa1) to Async(default) with arguments: #<GlobalID:0x00007fa8f12038b0 @uri=#<URI::GID gid://freemarket-sample62d/ActiveStorage::Blob/18>>
Completed 500 Internal Server Error in 67ms (ActiveRecord: 43.8ms)
ActionController::UrlGenerationError (No route matches {:action=>"edit", :controller=>"users"}, missing required keys: [:id]):
app/controllers/items_controller.rb:16:in `create'
ActiveStorage::Blob Load (0.5ms) SELECT `active_storage_blobs`.* FROM `active_storage_blobs` WHERE `active_storage_blobs`.`id` = 18 LIMIT 1
↳ /Users/kontatomoya/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.4.1/lib/active_record/log_subscriber.rb:98
〜後略〜
#3.解決方法
エラー文を発見したあとはその文言に従い、各自の言語環境に適した方法で修正していただければ解決となります
ちなみに今回の筆者のエラーの場合は複数のテーブル(itemテーブル,userテーブル)のuser_idを呼び出す記載をする際に、ストロングパラメータを使用しitems_controllerでuser_idの使用を許可したところで満足してしまい、id呼び出しの記述を忘れてしまっていました。そのため 、localhost:300/users/nill/editを呼び出してしまっていました。したがって下記の通りcreateアクションを修正することで、このエラーは出てこなくなりました。
class ItemsController < ApplicationController
〜中略〜
def create
@item = Item.new(item_params)
if @item.save
redirect_to edit_user_path(@item.user_id) #この@item.user_idを記載していませんでした。
else
render :new
end
end
〜中略〜
def item_params
params.require(:item).permit(:name,~省略~).merge(user_id: current_user.id)
#↑この行でセキュリティ的にitems_controllerでのcurrent_user.idをuser_idとして使用許可をしていました
end
#4.まとめ
今回のエラー原因の究明方法は他の言語でも利用できると思ったため、題名に rails と入れませんでした。
解決方法はそれぞれの言語やフレームワークごとに異なると思いますが、こと原因究明についてはどの言語でも等しく言えるのが、"このエラーを見かけた際はもう一度起動しているサーバーのログを見ていただければ解決できる"というのが今回の記事の主張になります。
何かの参考にしていただければと思います