shimmyShow Webアプリ開発ブログ

プログラミングスクールTECH::CAMPを73期を卒業し、紙媒体で実施されている教育の根本を変えていくためのサービスを開発中。当ブログを読めば誰でも当該サービスを開発できるようにするため軌跡を記録中。

ITストラテジスト(ST) 3ヶ月で1発合格する方法

ITストラテジスト試験概要

  •  年に1回4月(春)実施
  •  午前1,2 午後1,2 のタフな試験内容
  •  午後2は2000文字以上の論文を2時間で処理

上記から分かる通り非常にタフな試験内容になっています。 1年に一回の開催のため、不合格になり再度来年にもう一度受けるにはモチベーションを上げることがかなりしんどいと思います。仕事をしながら勉強し、試験を受ける方が大半だと思います。私も次の年に再度受験したくなかったことと、運が良かったことが重なり、午前1も含め1発で合格いたしました。合格するにあたり効果があったことのみ下記に記載していますので、皆様のお役に少しでも立てられれば幸いです。


使用した参考書

参考書のリンクはamazon 過去問はIPAの公式サイト 本サイトで私も書籍購入、過去問のダウンロード・印刷をしました。


学習方法

  • 3ヶ月前

 午前1
  応用情報の過去問3年分の印刷と回答作成
 午前2
  ALL IN ONE パーフェクトマスター の午前2パート熟読+問題解く
 午後1,2
  対策なし

 3ヶ月前は午前の対策をして合格の見通しを立てます。この段階では暗記する必要はなく、問題を見て解説を読み理解できるようにしました。


  • 2ヶ月前

午前1
 応用情報の過去問3年分の繰り返し読むだけ
午前2
 午前2の過去問5年分をAll in Oneを使いながら解く
午後1
 ALL IN ONE パーフェクトマスター の午後1パート熟読+問題解く
午後2
  合格論文の書き方の参考論文を読む
  (組み込みを選択しない人は組み込みの論文は読まなくてよい)

 2ヶ月前に午後の対策を本格的に開始して問題の形式になれ、どのような回答ならば合格できるかを把握する。午前1,2にはこの時期時間をかけないが、忘れないように毎日少しだけ触れる。


  • 1ヶ月前

 午前1
  応用情報の過去問3年分の繰り返し読むだけ
 午前2
  午前2の問題を出題するアプリを隙間時間にこなす
 午後1
  ALL IN ONE の午後1パート問題と解答を繰り返し読む
 午後2
  合格論文の書き方に掲載されている参考論文から類似のテーマで記載している論文を抜き出し、自分で型を作成する。私の場合は、製造業の製品にIoTモジュールを組み込む論文と自身の経験や知っている事例を参考に経営戦略立案、IT導入の企画、ITを活用した業務改革、グローバル展開などのパターンに対応できるように小さなモジュールを作成した。どの問題にでも使用できる短い文章を作成し、組み合わせることにより論文が完成するように用意した。

1ヶ月前は午後2だけに集中してよいと思います。


  • 1週間前

 午前1
  応用情報の過去問3年分の暗記
 午前2
  午前2の問題を出題するアプリを全制覇
 午後1
  午後1の過去問を3年分ほど問題と解答を読む
 午後2
  合格論文の書き方に掲載されている参考論文を音読し録音、通勤時間などに自分の音声を聞く
  自分で作成した短い文章の暗記

1週間前は机に向かう勉強のほとんどを午前1,2に使用する。午前の過去問も解き方がわからなくてもこの時期は解答を丸暗記する。解き方を調べている時間はこの時期にはないです。 午後はモジュール化したものを暗記することと、参考論文を通勤時間等に聞くことで論文の流れを完全に把握すること。


  • 試験本番  午前は上記を実施していれば60%は余裕だと思います。私も上記の方法で両者ともに80%を超えました。  午後1は選択しない問題も含め一通りさっと目を通し、想像しやすい問題2問に取り掛かることがベストだと思います。60%でよいので、想像しやすいものを選べば合格圏内には入ると思います。  午後2は手の疲れとの戦いです。まず問題を確認し、自分の作成してきた短い文章を当てはめられるか想像し、大まかな流れを問題用紙に記載します。キーポイントが整ったらあとはひたすら文章を記述してください。2200文字以上記載するため、時間はギリギリになります。とにかく字数制限にだけは引っかからないように文字数はしっかり満たすように気をつけてください。私は午後2の最後の方手が痙攣するくらいになっていました。

  • 最後に

あまり勉強しなくても効率的に合格できるみたいな記事もあると思いますが、私は2ヶ月ほどは真面目に勉強いたしました。 また、未経験でも試験を受験してよいということは、実務で経験したことを論文にすることだけを求められているわけではないと思います。未経験の方でも真面目に勉強すれば十分合格できると思いますので引き続き頑張ってみてください。

プログラミングスクール TECH CAMP(テックキャンプ)に通ってみた感想

期間

 2020.03 〜 2020.08

習得技術・具体的な内容

  • HTML, CSS:基本的なWebページは作成できるようになります。
  • Ruby:基本的なアプリが作成できるようになります。
  • Ruby on Rails:Blog、Twitter、LINEなどのアプリケーションの基本を学び、大枠は作成できるようになります。
  • JavaScript:基本的な非同期の実装等はできるようになります。
  • DB, SQL:DB設計からDBへのアクセスはできるようになります。
  • Git, Github:開発環境管理ツールを用いた開発方法を取得できます。
  • AWS:自分でクラウド上にサーバ構築ができるようになります。
  • グループ開発:フリマアプリをグループで開発します。グループ開発ならではの経験を積むことができます。

長所

  • 未経験からウェブアプリを開発できるレベルまで到達できる。
  • メンターに質問しエラーで詰まっても解決まで付き合ってくれる。
  • ライフコーチというモチベーションを維持に協力してくれる。
  • 自分以外の会社員をしながらスクールに通うやる気のある通学生と出会うことができる。
  • グループ開発を経験できるため、実務を転職前に体感できる。

短所

  • 高額(見合った価値はあるが安易な気持ちならばおすすめはしない)
  • Macを持っていない人は購入する必要がある。
     おすすめしないがレンタルもできるらしい。
  • ライフコーチやメンターという支えてくださる人はいるが、自走できないときつい。
  • 自分の作りたいものを作ることができるわけではない。
    (作りたいものに関するアドバイスはもらえる)

感想

仕事をしながら勉強時間を確保する習慣がついたことが大きいです。
最終課題終了後も勉強を続けることができています。
スクール費用を払っているため、見合った成果を出すまではプログラミングを続けたいと思います。
会社外でモチベーションの高い人々と出会うことができるため、
自己投資先としてはおすすめできるスクールです。

作成したアプリケーション一部

下記に私が作成したアプリケーションの一部を掲載する。

フリマアプリ

世の中に存在するフリマアプリを通学期間中に同期の通学生と作成した。
グループの方々は全員素晴らしい人柄で開発時間の確保など大変ではありましたが、
目標のアプリケーションを作成することができました。

f:id:erwinmarvin:20201014190518j:plain
フリマアプリ

オンラインテキストサービス

テックキャンプで学んだ内容をもとに、紙媒体の教科書をなくすため、
個人がオンライン上で教科書を作成できるサービスを開発しました。
テックキャンプのテキストを習得すれば下記は作成できるようになります。

f:id:erwinmarvin:20201014190855j:plain
オンラインテキストサービス

最後に

 少しでもプログラミングに興味があるならば、一度お話しを聞くことはありだと思います。
 人生の選択肢が増えるきっかけにはなると思います。
 

tech-camp.in

Railsで作成したアプリケーションへのBasic認証の導入

Basic認証とは

Webサイトへ最も簡単にアクセス制限をかける方法のひとつです。
Basic認証はWebサーバーの機能のひとつでRuby on Railsの場合、下記に説明する内容を記述をするだけで簡単にアクセス制限をつけられます。

実装対象プログラム・ファイル

  • app/controllers/application_controller.rb
  • ローカル環境 ~/.bash_profile
  • 本番環境(AWS) /etc/environment

Basic認証環境変数の追加

ユーザー名・パスワードを環境変数として追加する。 ローカル環境

$ vim ~/.bash_profile
# .bash_profileを開いたら、キーボード「i」を押下しインサートモードへ

# .bash_profileへ下記記述を追加(PASSWORDの値は各人で決めてください。下記は例として`7777`とします。)
export BASIC_AUTH_USER='admin'
export BASIC_AUTH_PASSWORD='7777'
# escキーを押下しインサートモードを終了
#「:wq」と入力し保存し、vimを終了する。

# .bash_profileの読込みのため、下記コマンドを実行し、設定した環境変数を有効にする。
$ source ~/.bash_profile

# 有効になっているか下記コマンドで確認する。
$ env | grep BASIC_AUTH_USER
# 有効な場合、`admin`と表示される。
$ env | grep BASIC_AUTH_PASSWORD
# 有効な場合、`7777`と表示される。

本番環境

$ ssh -i [ダウンロードした鍵の名前].pem ec2-user@[作成したEC2インスタンスと紐付けたElastic IP]
$ sudo vim /etc/environment
# environmentを開いたら、キーボード「i」を押下しインサートモードへ

# environmentへ下記記述を追加(PASSWORDの値は各人で決めてください。下記は例として`7777`とします。)

BASIC_AUTH_USER='admin'
BASIC_AUTH_PASSWORD='7777'

# escキーを押下しインサートモードを終了
#「:wq」と入力し保存し、vimを終了する。

# 編集した環境変数を適用するために一旦ログアウトします。
$ exit

# 再度ログイン
$ ssh -i [ダウンロードした鍵の名前].pem ec2-user@[作成したEC2インスタンスと紐付けたElastic IP]
# 環境変数が適用されているか下記コマンドを実行し確認する。

$ env | grep BASIC_AUTH_USER
# 有効な場合、`admin`と表示される。
$ env | grep BASIC_AUTH_PASSWORD
# 有効な場合、`7777`と表示される。

アプリケーションコントローラーへの実装

環境変数への設定が完了したため、環境変数を用いて実装を行う。

controllers/application_controller.rb

class ApplicationController < ActionController::Base
  before_action :basic_auth
  protect_from_forgery with: :exception

  private

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]
    end
  end

end

追加した環境変数を用いて、Basic認証が実施可能なユーザー名とパスワードを定義が完了した。
ローカルサーバーをrails sで起動するか、本番環境へアクセスし、
下記画面のようにユーザー名とパスワード入力画面が表示されれば認証部分の実装ができています。
最後に設定したユーザー名、パスワードを入力し、ルーティングに設定したトップ画面が閲覧できれば成功です。
f:id:erwinmarvin:20201008231531p:plain

補足

authenticate_or_request_with_http_basic Ruby on RailsでBasic認証を実装するためのメソッド ブロックへusernameとpasswordを設定することでBasic認証の利用が可能となる。

Rails5.0以降の本番環境(production環境)にてresetコマンドが実行できないことへの解消法

実施したこと・実施したいこと

初期データ登録用のファイルseeds.rbをローカル環境で変更し、
問題ないことをローカル環境にて確認した。
gitへpushし、Masterへマージ完了。
本番環境にてgit pull origin masterコマンド実行し、
変更後のseeds.rbを本番環境へプル完了。
seeds.rbを反映するため、現在のテーブルをresetするため、
下記コマンドを実行したところエラーが発生した。

本番環境

 Rails 5.2.4.4 

実行内容

全テーブルのデータをリセットするため下記コマンド実行
ターミナル

rails db:migrate:reset RAILS_ENV=production

エラー内容

ターミナル

rails aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
〜省略〜
Tasks: TOP => db:migrate:reset => db:drop => db:check_protected_environments
(See full trace by running task with --trace)

発生原因

Rails5.0以降から本番環境(production環境)へのDBの破壊系タスクのコマンド実行を保護する機能が導入さたため、当該エラーが発生していた。

解消方法

エラーメッセージにしたがって、リセットコマンドにDISABLE_DATABASE_ENVIRONMENT_CHECK=1を追加
ターミナル

rails db:migrate:reset RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1

下記のようにターミナルに表示され、無事リセットできた。
ターミナル

Dropped database 'online_text_production'
Created database 'online_text_production'
== 20200914135559 CreateTexts: migrating ======================================
-- create_table(:texts)
   -> 0.0113s
== 20200914135559 CreateTexts: migrated (0.0114s) =============================

== 20200924122430 DeviseCreateUsers: migrating ================================
以下省略

初期データ登録のため、下記コマンド実行
ターミナル

rails db:seed RAILS_ENV=production

下記メッセージが表示されたため、無事登録完了。
ターミナル

"create Users"
"create Text Categories"
"create Text Contents"

まとめ

Railsのバージョンによって実行できるコマンドや禁止されているコマンドがあるため、エラーメッセージを確認し適切に対応する。
まずはエラーメッセージを落ち着いて読むことからはじめます。

【第8章】オンライン教科書サービス作成【管理者権限と一般権限の付与 rails_admin, cancancan】

目的

第7章ではユーザー登録機能を実装した。本章ではアプリケーションの性質を考え管理者権限と一般権限を分ける実装を行う。

Gemfileへの追加

Gemfileの最下部へ下記を追加する。
Gemfile

〜上部分省略〜
gem 'cancancan', '~> 2.3'
gem 'rails_admin', '~> 2.0.0.beta'

追加後、ターミナルを立ち上げ、下記コマンドをonline_textディレクトリで実施する。
ターミナル

cd online_text
bundle install

cancan abilityモデルの生成

ユーザーごとのアクセス制限に関する処理を統一するためのクラス(Abilityクラスが多い)を作成する。
下記コマンドをonline_textディレクトリで実施し、abilityモデルを生成される。
ターミナル

cd online_text
rails g cancan:ability

app/models/ability.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    # Define abilities for the passed in user here. For example:
    #
    #   user ||= User.new # guest user (not logged in)
    #   if user.admin?
    #     can :manage, :all
    #   else
    #     can :read, :all
    #   end
    #
    # The first argument to `can` is the action you are giving the user
    # permission to do.
    # If you pass :manage it will apply to every action. Other common actions
    # here are :read, :create, :update and :destroy.
    #
    # The second argument is the resource the user can perform the action on.
    # If you pass :all it will apply to every resource. Otherwise pass a Ruby
    # class of the resource.
    #
    # The third argument is an optional hash of conditions to further filter the
    # objects.
    # For example, here the user can only update published articles.
    #
    #   can :update, Article, :published => true
    #
    # See the wiki for details:
    # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
  end
end

管理者権限を所有している場合、管理画面へのアクセス権限と全モデルに対する全アクションの許可をするため
生成されたモデルを下記のように編集する。

class Ability
  include CanCan::Ability

  def initialize(user)
    # Define abilities for the passed in user here. For example:
    #
    #   user ||= User.new # guest user (not logged in)
    #   if user.admin?
    #     can :manage, :all
    #   else
    #     can :read, :all
    #   end
    #
    # The first argument to `can` is the action you are giving the user
    # permission to do.
    # If you pass :manage it will apply to every action. Other common actions
    # here are :read, :create, :update and :destroy.
    #
    # The second argument is the resource the user can perform the action on.
    # If you pass :all it will apply to every resource. Otherwise pass a Ruby
    # class of the resource.
    #
    # The third argument is an optional hash of conditions to further filter the
    # objects.
    # For example, here the user can only update published articles.
    #
    #   can :update, Article, :published => true
    #
    # See the wiki for details:
    # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
    if user.try(:admin?)
      # 管理者ページへのアクセスを許可
      can :access, :rails_admin
      # 全ての権限を付与
      can :manage, :all
    end
  end
end

rails_adminの設定

下記コマンドを実施し、rails_adminの設定をする。
ターミナル

cd online_text
rails g rails_admin:install

上記コマンドを実施すると、ターミナルへ下記表示がされる。
今回は初期設定の/adminで表示するため、そのままEnterを押下して進む。

?  Where do you want to mount rails_admin? Press <enter> for [admin] 

生成された下記ファイルを下記のように編集する。
config/initializers/rails_admin.rb

RailsAdmin.config do |config|

  ### Popular gems integration

  ## == Devise ==
  config.authenticate_with do
    warden.authenticate! scope: :user
  end
  config.current_user_method(&:current_user)

  ## == CancanCan ==
  config.authorize_with :cancancan

  ## == Pundit ==
  # config.authorize_with :pundit

  ## == PaperTrail ==
  # config.audit_with :paper_trail, 'User', 'PaperTrail::Version' # PaperTrail >= 3.0.0

  ### More at https://github.com/sferik/rails_admin/wiki/Base-configuration

  ## == Gravatar integration ==
  ## To disable Gravatar integration in Navigation Bar set to false
  # config.show_gravatar = true

  config.actions do
    dashboard                     # mandatory
    index                         # mandatory
    new
    export
    bulk_delete
    show
    edit
    delete
    show_in_app

    ## With an audit adapter, you can add:
    # history_index
    # history_show
  end
end

管理者権限をUsersモデルへ付与

ユーザーを管理者か判断するため、Usersテーブルへadminカラムを追加する。
追加するカラムはboolean型とし、管理者かどうかをture or falseで判断する方針とする。
追加するためのマイグレーションファイルを下記コマンドで生成する。
ターミナル

cd online_text
rails g migration AddAdminToUsers

上記コマンドで生成されたマイグレーションファイルを下記のように編集する。
db/migrate/20XXXXXXXXXXXX_add_admin_to_users.rb

class AddAdminToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :admin, :boolean, default: false
  end
end

マイグレーションファイルを編集後、下記コマンドでUsersテーブルへ追加する。
ターミナル

cd online_text
rails db:migrate

管理画面

ローカルサーバーを立ち上げ、下記へアクセスし、
下記のように表示されれば、管理画面の生成は成功です。
http://localhost:3000/admin/

f:id:erwinmarvin:20200922201902p:plain

上図の場合、英語での表示のため、次章では日本語化を実施する。

【第7章】オンライン教科書サービス作成【ユーザー登録機能】

目的

第1章から第6章までで基本的な機能は作成した。本章ではユーザー管理機能を実装する。
ユーザー管理機能の実装には、deviseというgemを用いる。

Gemfileへの追加

Gemfileの最下部へgemの1種deviseを下記のように追加する。
Gemfile

〜上部分省略〜
gem 'devise'

追加後、ターミナルを立ち上げ、下記コマンドをonline_textディレクトリで実施する。
ターミナル

cd online_text
bundle install

Gemfile.lockに下記記述が追加されていれば成功です。

〜上部分省略〜
 devise (4.7.2)
〜下部分省略〜

deviseの設定ファイルを作成

上記でインストールしたdeviseを使用するためには、devise専用のコマンドを利用する必要がある。 ターミナル

cd online_text
rails g devise:install

上記コマンドを実行し、下記ファイルが生成されていれば成功です。

  • config/initializers/devise.rb

  • config/locales/devise.en.yml

devise機能を備えたUserモデルの作成

deviseを利用するためには、Userモデルを新しく作成する必要があります。
通常のモデルの生成コマンドとは異なります。
下記のようなdeviseを活用したモデルの作成用コマンドでUserモデルを作成する。
ターミナル

cd online_text
rails g devise user

下記のようにターミナルにファイルが生成されたことが表示されれば成功です。
f:id:erwinmarvin:20200918222633p:plain ルーティングを設定するroutes.rbには下記のようなdevise_for :usersの記述が自動で追加されます。 config/routes.rb

Rails.application.routes.draw do
  devise_for :users
  root to: 'texts#index'
  resources :texts, only: [:new, :create, :show, :edit, :update, :destroy]
end

下記コマンドを実行し、Usersテーブルを作成する。 ターミナル

cd online_text
rails db:migrate

下図のようにUsersテーブルが生成されていれば成功です。
f:id:erwinmarvin:20200918223312p:plain

ログイン機能の実装

まずはログインしていない場合のボタンを実装していく。
新規テキスト投稿ボタンは一旦削除し、下記のように実装する。
app/views/layouts/application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title>OnlineText</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <header class="header">
      <div class="header__title">
        <%= link_to "OnlineText", root_path, class: "header__title--text" %>
      </div>
      <div class="header__right">
        <%= link_to "ログイン", new_user_session_path, class: "header__right--btn" %>
        <%= link_to "新規登録", new_user_registration_path, class: "header__right--btn" %>
      </div>
    </header>
    <div class="contents">
      <%= yield %>
    </div>
  </body>
</html>

下図のようにログインと新規登録のボタンが画面上部に表示されていれば成功です。
f:id:erwinmarvin:20200918224220p:plain

ボタンの表示内容の変更

ログインしている場合には、新規テキスト作成ボタンとログアウトボタンを表示できるように実装する。
app/views/layouts/application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title>OnlineText</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <header class="header">
      <div class="header__title">
        <%= link_to "OnlineText", root_path, class: "header__title--text" %>
      </div>
      <div class="header__right">
       <% if user_signed_in? %>
          <%= link_to "新規テキスト作成", new_text_path, class: "header__right--btn" %>
          <%= link_to "ログアウト", destroy_user_session_path, method: :delete, class: "header__right--btn" %>
        <% else %>
          <%= link_to "ログイン", new_user_session_path, class: "header__right--btn" %>
          <%= link_to "新規登録", new_user_registration_path, class: "header__right--btn" %>
        <% end %>
      </div>
    </header>
    <div class="contents">
      <%= yield %>
    </div>
  </body>
</html>

devise用のビューを作成

下記コマンドを実行し、devise用のビューを作成する。 ターミナル

cd online_text
rails g devise:views

ログイン画面と新規登録画面が下記のように表示されれば成功です。
f:id:erwinmarvin:20200918225023p:plain f:id:erwinmarvin:20200918225040p:plain

実際に下記のようにログインをしてみる。
f:id:erwinmarvin:20200918225251p:plain signupボタン押下後、Usersテーブルを確認すると、下記のように登録できていることが確認できる。
f:id:erwinmarvin:20200918225500p:plain ログイン後、トップページの上部ボタン名が新規テキスト作成とログアウトに変更されていることが確認できる。
f:id:erwinmarvin:20200918225659p:plain

上記のように表示されていればユーザー登録機能は成功です。
次章では管理者と一般ユーザーで機能を分ける機能について説明する。

【第6章】オンライン教科書サービス作成【教科書の削除機能】

目的

第5章によって教科書の編集ページを作成した教科書の編集ができるようになったため、本章で投稿したテキストの削除機能を実装する。

ルーティング設定

config/routes.rbを下記のように実装する。

Rails.application.routes.draw do
  root to: 'texts#index'
  resources :texts, only: [:new, :create, :show, :edit, :update, :destroy]
end

コントローラーの実装

上記にてdestroyアクションのルーティングを設定したので、コントローラーにdestroyアクションを実装していく。
app/controllers/texts_controller.rbを下記のように実装する。

class TextsController < ApplicationController

  def index
    @texts = Text.all
  end

  def new
    @text = Text.new
  end

  def create
    Text.create(text_params)
    redirect_to root_path
  end

  def show
    @text = Text.find(params[:id])
  end

  def edit
    @text = Text.find(params[:id])
  end

  def update
    text = Text.find(params[:id])
    text.update(text_params)
    redirect_to text_path(text.id)
  end

  def destroy
    text = Text.find(params[:id])
    text.destroy
    redirect_to root_path
  end

  private
  def text_params
    params.require(:text).permit(:title, :abstract, :body).merge(public_flag: "1")
  end

end

ビューファイルへ削除ボタンの追加

削除機能は各教科書ビューから実施できるよう各教科書のビューへ削除ボタンを用意する。
app/views/texts/show.html.erb

<div class="textTitle">
  <%= @text.title %>
</div>
<div class="textDate">
  <%= @text.created_at %>
</div>
<div class="textAuthor">
</div>
<div class="textManage">
  <%= link_to "テキスト編集", edit_text_path(@text.id), class: "textManage__edit" %>
  <%= link_to "テキスト削除", text_path(@text.id), method: :delete, class: "textManage__delete" %>
</div>
<div class="textText">
  <%= simple_format @text.body %>
</div>

挙動としては下図のようになれば成功です。
削除前のトップページが下図
f:id:erwinmarvin:20200917225039p:plain 個別教科書の画面 f:id:erwinmarvin:20200917225059p:plain 削除ボタン押下後、トップページへ遷移すると該当の教科書が削除されている。 f:id:erwinmarvin:20200917225118p:plain

削除が正常にできていれば成功です。
お疲れ様でした!!!

基本的な機能は完了ですが、現在の実装の場合誰でも教科書の投稿や編集、削除ができてしまうため、
次章ではユーザー管理機能を説明する。