[rails]deviseに登録しているユーザーのプロフィール画像を編集したい
解決したいこと
現在、Ruby on Railsにてtwitterもどきを作っています。
(画像アップロードに使っているgemはcarrierwaveとminimagicです。)
deviseを用いてログイン機能を実装しているのですが、プロフィール画像の編集ができなくて詰まっています。
どなたか心優しい方、解決策をご教授ください、、、!!
該当するソースコード
現在、デフォルトの画像をapplication_helper内のavatar_urlメソッドで表示しているという状況です。
Userモデルのprofile.photoカラムに画像の情報を追加すればいいと思うのですが、deviseのコントローラーにあるeditアクションのいじり方がわからないので詰まっています。
edit.html.erb
(階層はviews/devise/regisrations/edit.html.erbになってます。)
<div class="col-md-offset-2 mb-4 edit-profile-wrapper">
<div class="row">
<div class="col-md-8 mx-auto">
<div class="profile-form-wrap">
<%= form_with scope: resource, as: resource_name, url: registration_path(resource_name), local: true, method: :patch do |f| %>
<div class="form-group">
<%= f.label :name, "名前" %>
<%= f.text_field :name, autofocus: true, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :email, "メールアドレス" %>
<%= f.email_field :email, autofocus: true, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :password, "パスワード" %>
<%= f.password_field :password, autofocus: "off", class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :password_confirmation, "パスワードの確認" %>
<%= f.password_field :password_confirmation, autofocus: "off", class: "form-control" %>
</div>
<%= f.submit "変更する", class: "btn btn-primary" %>
<% end %>
</div>
</div>
</div>
</div>
show.html.erb
<div class="users-show">
<div class="profile-wrap">
<div class="row">
<div class="col-md-4 text-center">
<%= image_tag avatar_url(@user), class: "round-img" %>
</div>
<div class="col-md-8">
<div class="row">
<h1><strong><%= @user.name %></strong></h1>
<%= link_to "プロフィールを編集", edit_user_registration_path, class: "btn btn-outline-dark common-btn edit-profile-btn" %>
<button type="button" class="setting" data-toggle="modal" data-target="#exampleModal"></button>
<!-- モーダル -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog"
aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">設定</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="list-group text-center">
<%= link_to "サインアウト", destroy_user_session_path, method: :delete, class: "list-group-item list-group-item-action" %>
<%= link_to "キャンセル", "#", class: "list-group-item list-group-item-action", "data-dismiss": "modal" %>
</div>
</div>
</div>
</div>
<!---->
</div>
<% if @user == current_user %>
<div class="row">
<p>
<%= @user.email %>
</p>
</div>
<% end %>
</div>
</div>
</div>
<h2 class="card-title">いいねした投稿一覧</h2>
<% @likes.each do |like| %>
<% post = Post.find_by(id: like.post_id) %>
<div class="row">
<div class="card-box col-md-8 mx-auto">
<div class="card-wrap row">
<div class="card-image-wrap col-md-4">
<%= image_tag post.image.url, class:"card-image"%>
</div>
<div class="card-body col-md-8">
<div class="card-text-box d-flex align-items-center">
<p class="time-text"><%= post.created_at.to_s(:datetime_jp) %></p>
</div>
<%= link_to(post_path(post), class:"no-text-decoration") do %>
<h1 class="card-title"><%= post.title %></h1>
<p class="card-text"><%= post.content %></p>
<% end %>
<div class="tag-box">
<% post.tags.each do |tag| %>
<span>
<%= link_to(tag.tag_name, tag_posts_path(tag_id: tag.id), class:"badge badge-pill badge-info") %>
</span>
<% end %>
</div>
</div>
</div>
</div>
</div>
<% end %>
</div>
application_helper.rb
module ApplicationHelper
def avatar_url(user)
return user.profile_photo.url unless user.profile_photo.url.nil?
gravatar_id = Digest::MD5::hexdigest(user.email).downcase
"https://techpit-market-prod.s3.amazonaws.com/uploads/part_attachment/file/15782/2da91636-af73-4eed-91cd-320a0399609c.jpg"
end
end
users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find_by(id: params[:id])
@likes = Like.where(user_id: @user.id)
end
end
user.rb
class User < ApplicationRecord
has_many :posts, dependent: :destroy
has_many :likes
has_many :comments
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
validates :name, presence: true, length: { maximum: 50 }
def update_without_current_password(params, *options)
if params[:password].blank? && params[:password_confirmation].blank?
params.delete(:password)
params.delete(:password_confirmation)
end
result = update(params, *options)
clean_up_passwords
result
end
mount_uploader :profile_photo, ImageUploader
end
自分で試したこと
・carrierwaveをつかって、profile_photoをimageUploderに紐付け(?)した。
・deviseのコントローラーをいじりたいと思ったので、rails g devise:controllers usersのコマンドを実行して、controller/users/のフォルダ内にデフォルトのコントローラーをいっぱい用意した。
参考にした記事
どうぞよろしくおねがいします。
0