前提・実現したいこと
ActiveStorageで保存した画像が上手く受け渡せていないようで、エラーが起きているのを解決し、保存した画像を表示させたいです。
RailsでSNSアプリを作成し、一度Herokuにデプロイしたところ問題なく作動していました。
公開後アイコン画像をアップロードしても一時的にしか保持されないことを知り、Active StorageとAWS S3を使い画像保存をさせようとしています。
S3への連携は上手くいき、元から作っていたアカウントのアイコン画像を編集してS3へ保存させたり、保存したアイコン画像を投稿一覧やユーザー詳細画面で表示することはできたのですが、以下の画面遷移でエラーが発生してしまいます。
①新しいアカウントを登録しようとして入力後に新規登録ボタンを押して情報を送信したとき
②ユーザー一覧を表示しようとしたとき
発生している問題・エラーメッセージ
①新しいアカウントを登録しようとして入力後に新規登録ボタンを押して情報を送信したとき
(:image以外は最初に作成したときからあって問題なく動いてたので、後から追加した:imageでエラーが起きていると思われます。)
ActiveSupport::MessageVerifier::InvalidSignature in UsersController#create ActiveSupport::MessageVerifier::InvalidSignature Extracted source (around line #20): def create @user = User.new( #ここが20行目 name: params[:name], email: params[:email], password: params[:password], profile: "よろしくお願いします", image: "default_user.jpg" )
②ユーザー一覧を表示しようとしたとき
ArgumentError in Users#index Showing /Users/UserName/Desktop/sample_app/app/views/users/index.html.erb where line #7 raised: Can't resolve image into URL: to_model delegated to attachment, but attachment is nil Extracted source (around line #7): <div class="users-index-item"> <div class="user-left"> <%= image_tag user.image %> #ここが7行目 </div> <div class="user-right"> <%= link_to(user.name, "/users/#{user.id}") %>
該当のソースコード
①②共通
users_controller.rb(長くなるので関係なさそうなことは削っています)
class UsersController < ApplicationController def index @users = User.all.order(created_at: :desc) end def new @user = User.new end def create @user = User.new( name: params[:name], email: params[:email], password: params[:password], profile: "よろしくお願いします", image: "default_user.jpg" ) if @user.save session[:user_id] = @user.id flash[:notice] = "ユーザー登録が完了しました" redirect_to("/users/#{@user.id}") else render("users/new") end end def update @user = User.find_by(id: params[:id]) @user.name = params[:name] @user.email = params[:email] @user.profile = params[:profile] if params[:image] @user.image = params[:image] end if @user.save flash[:notice] = "ユーザー情報を編集しました" redirect_to("/users/#{@user.id}") else render("users/edit") end end
①新しいアカウントを登録しようとして入力後に新規登録ボタンを押して情報を送信したとき
app/view/users/new.html.erb
仕様として最初にユーザー登録するときはプロフィールとアイコン画像は選べずデフォルトのもので登録されているようにしています。
<div class="main users-new"> <div class="container"> <div class="form-heading">新規ユーザー登録</div> <div class="form users-form"> <div class="form-body"> <% @user.errors.full_messages.each do |message| %> <div class="form-error"> <%= message %> </div> <% end %> <%= form_tag("/users/create", {multipart: true}) do %> <p>ユーザー名</p> <input name="name" value="<%= @user.name %>"> <p>メールアドレス</p> <input name="email" value="<%= @user.email %>"> <p>パスワード</p> <input type="password" name="password" value="<%= @user.password %>"> <input type="submit" value="新規登録"> <% end %> </div> </div> </div> </div>
②ユーザー一覧を表示しようとしたとき
app/view/users/index.html.erb
<div class="main users-index"> <div class="container"> <h1 class="users-heading">ユーザー一覧</h1> <% @users.each do |user| %> <div class="users-index-item"> <div class="user-left"> <%= image_tag user.image %> </div> <div class="user-right"> <%= link_to(user.name, "/users/#{user.id}") %> </div> </div> <% end %> </div> </div>
試したこと
①新しいアカウントを登録しようとして入力後に新規登録ボタンを押して情報を送信したとき
エラー文より、User.new内に上手く認識されていない?カラムがあって、それが新しく加えた:imageで引っかかっていると思われるのですが、そこからどうすればいいかわかりませんでした。
最初のユーザー登録画面からプロフィールとアイコン画像も自分で登録できるようにすれば解決するかと思い、new.html.erbにもedit.html.erbと同様のコードで入力できるようにしてみたのですが、同じエラー文が出てしまい関係なかったので戻しました。
②ユーザー一覧を表示しようとしたとき
エラー文からuser.imageへ上手く受け渡せずnilになっているのが原因と思われるのですが、ここからどうすればいいかわかりませんでした。
補足情報(FW/ツールのバージョンなど)
edit.html.erbも一応貼っておきます。
登録済のアカウントはこのコードからアイコン画像を含めアカウント情報を問題なく変更できます。
また、他にも補足で貼ったほうがよいコードがありましたら、ご指摘いただければ幸いです。
よろしくお願いいたします。
app/view/users/edit.html.erb
<div class="main users-edit"> <div class="container"> <div class="form-heading">アカウント編集</div> <div class="form users-form"> <div class="form-body"> <% @user.errors.full_messages.each do |message| %> <div class="form-error"> <%= message %> </div> <% end %> <%= form_tag("/users/#{@user.id}/update", {multipart: true}) do %> <p>ユーザー名</p> <input name="name" value="<%= @user.name %>"> <p>メールアドレス</p> <input name="email" value="<%= @user.email %>"> <p>アイコン画像</p> <%= file_field_tag :image %> <p>プロフィール</p> <input name="profile" value="<%= @user.profile %>"> <input type="submit" value="保存"> <% end %> </div> </div> </div> </div>
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。