前提・実現したいこと
users_controllerのupdateアクションで登録した画像が、users_controllerで渡したviewファイル下でしか画面に反映しないため解決したいです。
<users_controllerの各アクションで表示されたviewでは、名前の下にプロフィール画像が表示される>
https://i.gyazo.com/8a4ede8629d3625c8e2c58b9ecedded0.png
<別のcontrollerのアクションで表示されたviewでは、名前の下に登録したプロフィール画像が表示されない>
https://i.gyazo.com/a865c2515278c5429154d4ed7c4fd234.png
該当のソースコード
UsersController
1class UsersController < ApplicationController 2 def show 3 @user = User.find(params[:id]) 4 @cafeterias = @user.cafeterias 5 end 6 7 def edit 8 @user = User.find(params[:id]) 9 if @user != current_user 10 redirect_to user_path(current_user), alert: "不正なアクセスです。" 11 end 12 end 13 14 def update 15 @user = User.find(params[:id]) 16 if @user.update(user_params) 17 redirect_to user_path(@user), notice: "ユーザー情報を更新しました。" 18 else 19 render :edit 20 end 21 end 22 23 private 24 def user_params 25 params.require(:user).permit(:username, :email, :password, :password_confirmation, :profile, :profile_image ) 26 end 27 28end
UsersEditHtmlHaml
1= form_with model: @user, class: "form", local: true do |f| 2 = f.text_field :username, placeholder: :名前の変更, class: "form-contents" 3 = f.file_field :profile_image 4 = f.text_area :profile, placeholder: :プロフィール情報を入力してください, class: "form-detail" 5 = f.submit '完了する', class: "form-btn" 6= render "shared/footer"
UsersRb
1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 7 # mount_uploader :profile_image_id, ImageUploader 8 attachment :profile_image 9 has_many :cafeterias 10 validates :username, presence: true 11end
CafeteriaRb
1class Cafeteria < ApplicationRecord 2 validates :name, :addres, :detail, presence: true 3 belongs_to :user 4 5 mount_uploader :image, ImageUploader 6 attachment :profile_image 7end
<追記>
⬇︎⬇︎画像が表示できていない、cafeterias_controllerのコード⬇︎⬇︎
class CafeteriasController < ApplicationController def index @cafeterias = Cafeteria.includes(:user) end def new @cafeteria = Cafeteria.new end def create Cafeteria.create(cafeteria_params) redirect_to cafeterias_path end def show @cafeteria = Cafeteria.find(params[:id]) end def edit @cafeteria = Cafeteria.find(params[:id]) end def update cafeteria = Cafeteria.find(params[:id]) cafeteria.update(cafeteria_params) redirect_to cafeteria_path(cafeteria.id) end def destroy cafeteria = Cafeteria.find(params[:id]) cafeteria.destroy redirect_to cafeterias_path end private def cafeteria_params params.require(:cafeteria).permit(:name, :image, :detail, :addres).merge(user_id: current_user.id) end end
⬇︎views/users/show.html.haml(このビューには画像が表示される)
#header.big-bg .wrapper = render "shared/header" .page-title #{@user.username}さんのマイページ %section.section .container .columns.is-centered .column.is-8 .columns.is-centered .column.is-4 %figure.image.is-128x128{style: "margin-left: auto; margin-right: auto;"} = link_to edit_user_path do = attachment_image_tag @user, :profile_image, fallback: "images/no-image.png", class: "profile-image" .column.is-8 %table.table.is-fullwidth %tr %td.is-size-4 %strong= @user.username - if @user.id == current_user.id %td.is-size-4 = @user.email %td = link_to "編集", edit_user_path(@user), class: "button is-primary" %table.table.is-fullwidth %tr %td = @user.profile %section.section .cafeterias-container .columns.is-multiline - @cafeterias.each do |cafeteria| = render partial: "cafeterias/cafeteria", locals: { cafeteria: cafeteria } = render "shared/footer"
⬇︎views/cafeterias/show.html.haml(このビューには画像が表示されない)
#header.big-bg .wrapper = render "shared/header" .page-title #{@cafeteria.name}の詳細 %section.section .container .columns.is-centered .column.is-5 .card .card-image %figure.image.is-4by3 %tr %td= image_tag @cafeteria.image.to_s .card-content .media .media-content .cafeteriaTitle = @cafeteria.name .cafeteriaDate = @cafeteria.created_at.strftime("%Y年%m月%d日 %H時%M分") .content %table.table.is-narrow %tr %th 感想 %tr %td= simple_format @cafeteria.detail - if user_signed_in? && current_user.id == @cafeteria.user_id .videoManage = link_to "編集画面へ", edit_cafeteria_path(@cafeteria.id), class: "button is-success cafeteriaManage__edit" = link_to "投稿の削除", cafeteria_path(@cafeteria.id), method: :delete, class: "button is-danger cafeteriaManage__delete" .column.is-4 %article.panel.is-link %p.panel-heading By #{@cafeteria.user.username} .panel-block %p.control = @cafeteria.user.profile = link_to user_path(@cafeteria.user), class: "panel-block" do %span.panel-icon %i.fas.fa-user{"aria-hidden" => "true"} = @cafeteria.user.username さんのページへ = render "shared/footer"
⬇︎<さらに追記> 上手く画像が反映しないveiw(_cafetelia.html.haml)ファイルです。
.column.is-4 .card .card-image %figure.image.is-4by3 =link_to cafeteria_path(cafeteria.id), class: "content-image__box" do %tr %td= image_tag cafeteria.image.to_s .card-content .cafeteria-name = link_to cafeteria.name, cafeteria_path(cafeteria.id), class: "content__right__top--title" .media .media-left %figure.image.is-48x48 = attachment_image_tag @user, :profile_image, fallback: "images/no-image.png", class: "profile_image" .media--userName = link_to cafeteria.user.username, user_path(cafeteria.user), class: "content__right__bottom--userName--btn" .detail .detail--date = cafeteria.created_at.strftime("%Y年%m月%d日 %H時%M分")
上記の14行目
= attachment_image_tag @user, :profile_image, fallback: "images/no-image.png", class: "profile_image"
こちらのコードを反映させ、cafeteriasのコントローラー内のビューにusersで登録したprofile_imageを表示させたいのですが、上手くいきません、、、(画像があるのに空だと判断され、fallback: "images/no-image.png"が呼び込まれてしまいます)
こちらを解決したいです。
試したこと
ややこしいですが、cafeteriaの画像投稿にはcarrierwaveを、usersの画像投稿にはrefileを使用しています。
モデルの設定が間違っていると思い、mount_uploader :image, ImageUploaderを非表示にしてみたりして試したのですが改善されませんでした。
補足情報(FW/ツールのバージョンなど)
rails 5.2.4.2
回答1件
あなたの回答
tips
プレビュー