pinoko72447
@pinoko72447 (中村 いぬ)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

[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

1Answer

手元に環境ないので試せないですが、deviseのコントローラーを上書きして、updateメソッド内でcarrierwaveでs3に上げ直せばいいんじゃないかなっと思います。

0Like

Your answer might help someone💌