戻る

Rails6.0


動画学習サイトの構築 Rails6.0

  (0)
2,000円

タスク2-11   画像アップロード(Active Storage)

このタスクについて


タスクの内容を一部抜粋します。
プロジェクトを購入していただくとこのタスクの内容の全てを読みやすい表示で見ることができます。
プログラムコードが色分けされて見やすくなります。
プログラムコードに行番号が付きます。
本文が色分けされて見やすくなります。
そしてこのアプリケーションのフルコードをダウンロードすることが可能になります。




アバター画像をアップロードできるようにします。


コマンド
rails active_storage:install


コマンド マイグレーションの適用
rails db:migrate


「app\models\user.rb」ファイルに記述を追加します。


1.3行目に以下の記述を追加します。
has_one_attached :avatar



2.17行目に以下の記述を追加します。
Googleアカウントでログインした場合、Googleのアカウント画像が表示されるようにしています。
       if !user.provider 
        user.update(uid: auth.uid, provider: auth.provider, image: auth.info.image) 
      end 



記述追加 app\models\user.rb
 
class User < ApplicationRecord 

  has_one_attached :avatar 

  # Include default devise modules. Others available are: 
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 
  devise :database_authenticatable, :registerable, 
         :recoverable, :rememberable, :validatable, 
         :confirmable, :omniauthable 

  #長さ50文字以下 入力必須 
  validates :full_name, presence: true, length: {maximum: 50} 

  def self.from_omniauth(auth) 
    user = User.where(email: auth.info.email).first 
    if user 
      if !user.provider 
        user.update(uid: auth.uid, provider: auth.provider, image: auth.info.image) 
      end    
      return user 
    else 
      where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
        user.email = auth.info.email 
        user.password = Devise.friendly_token[0, 20] 
        user.full_name = auth.info.name   # ユーザーモデルに名前があると仮定 
        user.image = auth.info.image # ユーザーモデルに画像があると仮定 
        user.uid = auth.uid 
        user.provider = auth.provider 
      end 
    end 
  end  
end 



ユーザーストロングパラメータに「, :avatar」の記述を追加します。


記述追加 app\controllers\users_controller.rb
20行目に「, :avatar」の記述を追加しています。
カンマを忘れないようにして下さい。
 
class UsersController < ApplicationController 

  before_action :authenticate_user! 

  def dashboard 
  end 

  def update 
    @user = current_user 
    if @user.update_attributes(current_user_params) 
      flash[:notice] = "保存しました" 
    else 
      flash[:alert] = "更新できません" 
    end 
    redirect_to dashboard_path 
  end 

  private 
  def current_user_params 
    params.require(:user).permit(:about, :status, :avatar) 
  end 
end 



アバター画像用のヘルパーを追加します。


記述更新 app\helpers\application_helper.rb
 
module ApplicationHelper 
    def avatar_url(user) 
        if user.avatar.attached? 
            url_for(user.avatar) 
        elsif user.image? 
            user.image 
        else 
            ActionController::Base.helpers.asset_path('icon_default_avatar.jpg') 
        end 
    end    
end 



ダッシュボードビューに記述を追加します。


1.14行目の記述を削除します。
 <!-- 記述削除 --> 
<%= image_tag 'icon_default_avatar.jpg' %> 



2.14行目削除した部分に以下の記述を追加します。
<%= image_tag avatar_url(current_user), class: "is-rounded" %>



3.24行目の記述を削除します。
 <!-- 記述削除 --> 
<button class="button is-primary is-outlined is-fullwidth">アバター画像アップロード</button> 



4.24行目の削除した部分に以下の記述を追加します。
 <%= form_for :user, url: users_edit_url(@user), action: :update, method: :post do |f| %> 
	<div class="file"> 
		<label class="button is-primary is-outlined is-fullwidth"> 
			<%= f.file_field :avatar, class: "file-input", onchange: "this.form.submit();" %> 
			<i class="fas fa-upload"></i>&nbsp;&nbsp;&nbsp; アバター画像アップロード 
		</label> 
	</div> 
<% end %>   



記述更新 app\views\users\dashboard.html.erb
 
<section class="section"> 
    <div class="container"> 
        <div class="columns"> 
        
            <!-- 左パネル --> 
            <div class="column is-one-third"> 
                <div class="columns is-multiline"> 
                    <!-- 上部 --> 
                    <div class="column is-full"> 
                        <div class="card"> 
                            <!-- アバター --> 
                            <div class="card-content is-horizontal-center is-flex"> 
                                <figure class="image is-256x256"> 
                                    <%= image_tag avatar_url(current_user), class: "is-rounded" %> 
                                </figure> 
                            </div> 
                            
                            <div class="card-content"> 
                                <!-- 画像アップロードボタン --> 
                                <div class="content has-text-centered"> 
                                    <p class="title is-5"> 
                                        <%= current_user.full_name %> 
                                    </p> 
                                <%= form_for :user, url: users_edit_url(@user), action: :update, method: :post do |f| %> 
                                    <div class="file"> 
                                        <label class="button is-primary is-outlined is-fullwidth"> 
                                            <%= f.file_field :avatar, class: "file-input", onchange: "this.form.submit();" %> 
                                            <i class="fas fa-upload"></i>&nbsp;&nbsp;&nbsp; アバター画像アップロード 
                                        </label> 
                                    </div> 
                                <% end %>   
                                </div> 
                                <hr class="h-10"> 
                                
                                <!-- アカウント情報 --> 
                                <article class="media"> 
                                    <div class="media-content">アカウント登録日</div> 
                                    <div class="media-right"> 
                                        <strong><%= I18n.l(current_user.created_at, format: :full_date) %></strong> 
                                    </div> 
                                </article> 
                                <hr class="h-10"> 
                                
                                <!-- オンラインステータス --> 
                                <article> 
                                    <div class="media"> 
                                        <div class="media-content">ステータス</div> 
                                        <div class="media-right"> 
                                            <strong><% if current_user.status %> オンライン <% else %> オフライン <% end %></strong> <i class="toggle far fa-edit" aria-controls="user-status"></i> 
                                        </div> 
                                    </div> 
                                    <div class="content"> 
                                        <%= form_for :user, url: users_edit_url(@user), action: :update, method: :post, html: {id: 'user-status', class: 'is-hidden'} do |f| %> 
                                            <div class="field"> 
                                                <%= f.select(:status, options_for_select([["オンライン", true], ["オフライン", false]]), {}, {class: "select is-fullwidth"}) %> 
                                            </div> 
                                            <a class="toggle button is-light" aria-controls="user-status">キャンセル</a> 
                                            <%= f.submit "保存", class: "button is-danger" %> 
                                        <% end %> 
                                    </div> 
                                </article> 
                            </div> 
                        </div> 
                    </div> 
                    <!-- 下部 --> 
                    <div class="column is-full"> 
                        <div class="card"> 
                            <div class="card-content"> 
                                <!-- アカウント詳細 --> 
                                <article> 
                                    <div class="media"> 
                                        <div class="media-content"> 
                                            <p> 
                                                <strong>自己紹介</strong> 
                                                <br> 
                                                <%= current_user.about %> 
                                            </p> 
                                        </div> 
                                        <div class="media-right"> 
                                            <i class="toggle far fa-edit" aria-controls="user-about"></i> 
                                        </div> 
                                    </div> 
                                    <div class="content"> 
                                        <%= form_for :user, url: users_edit_url(@user), action: :update, method: :post, html: {id: 'user-about', class: 'is-hidden'} do |f| %> 
                                            <div class="field"> 
                                                <%= f.text_area :about, autofocus: true, autocomplete: 'form', class: 'input'%> 
                                            </div> 
                                            <a class="toggle button is-light" aria-controls="user-about">キャンセル</a> 
                                            <%= f.submit "保存", class: "button is-danger" %> 
                                        <% end %> 
                                    </div> 
                                </article> 
                                <hr class="h-10"> 
                                
                                <!-- アカウント連携 --> 
                                <article class="media"> 
                                    <div class="content"> 
                                        <p> 
                                            <strong>アカウント連携</strong><br/> 
                                            <% if current_user.provider == 'google_oauth2' %> 
                                                <span class="has-text-success">Googleアカウントでログイン中</span> 
                                            <% else %> 
                                                <span class="has-text-danger">アカウント連携していません</span> 
                                            <% end %> 
                                        </p> 
                                    </div> 
                                </article> 
                            </div> 
                        </div> 
                    </div> 
                </div> 
            </div> 
            <!-- 右側 --> 
            <div class="column"> 
                <div class="columns is-multiline"> 
                    <!-- 購入したプロジェクト --> 
                    <div class="column is-one-third has-text-centered"> 
                    
                    </div> 
                </div> 
            </div> 
            
        </div> 
    </div> 
</section> 



ナビゲーションバーを更新します。


記述追加 app\views\shared\_navbar.html.erb(32行目)
 <figure class="image is-48x48 m-r-5"> 
    <div style="margin-top: 0.6rem;"> 
      <%= image_tag avatar_url(current_user), class: "is-rounded" %> 
    </div> 
</figure> 



この続きはプロジェクトを購入していただくことで見ることができます。
プロジェクトを購入していただくとこのタスクの内容の全てを読みやすい表示で見ることができます。
プログラムコードが色分けされて見やすくなります。
プログラムコードに行番号が付きます。
本文が色分けされて見やすくなります。
そしてプロジェクトを購入するとこのアプリケーションのフルコードをダウンロードすることができます。

まだレビューはありません。

動画学習サイトの構築 Rails6.0

2,000円

Rails6.0で作成しています。
動画で学べるサイトを構築するプロジェクトです。
プロジェクトを登録し、そのプロジェクトに動画を登録できます。
プロジェクトはクレジットカードで購入でき、購入後すぐに動画を見ることができます。
写真の複数アップロード、レビュー機能の実装、Google認証、アマゾンS3の利用方法も解説。
管理ダッシュボードtrestleの実装、Gメールの設定、 HEROKUへのデプロイ方法を解説。
質問があればメッセージを送ることができ、リアルタイムで会話表示することができます。
フルコードのダウンロード可能。

タスク数: 128