目標:昨日より成長できる初心者エンジニアへ。
初めてのWEBアプリ制作の工程を公開することで、次回もっとスムーズに作れるよう、今回の記録を残したいと思います。
ここで実装前にやること(3)をまとめます。
はじめの方向性を間違えないよう、
@enzenさんの投稿"しっかり設計する"より、やるべき筋道を洗い出しました。
最後に、機能の詳細を設計をまとめたいと思います。
機能の詳細を設計します。
<具体的には>主にコントローラの設計をしておきます。
さて、ここで今まで勉強してきたアプリの復習。
コントローラに記述するべきことは何だったでしょう??
コントローラに記述すること
- インスタンス変数の定義。(@message = Message.newなど)
- paramsの定義。
- ログインの設定
- 非同期通信の設定
- リダイレクトの設定
- アラートの設定
今回作成するコントローラは4つ。
class ApplicationController < ActionController::Base
#CSRF対策
protect_from_forgery with: :exception
#ログインしていると表示可能。ログイン認証されていなければrootパスへリダイレクトする
before_action :authenticate_user!
# before_actionで定義したメソッドを実行
before_action :configure_permitted_parameters, if: :devise_controller?
protected
#deviseのストロングパラメーターにカラム追加するメソッドを定義
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
end
end
class GroupsController < ApplicationController
def index
end
#groupのnewページでグループ情報を登録。
def new
@group = Group.new
@group.users << current_user
end
#groupのnewページでグループ作成完了。
def create
@group = Group.new(group_params)
if @group.save
redirect_to root_path, notice: 'グループを作成しました'
else
render :new
end
end
#groupのupdateページでグループ編集。編集されたら、group_messagesのpathへ。
def update
if @group.update(group_params)
redirect_to group_messages_path(@group), notice: 'グループを編集しました'
else
render :edit
end
end
private
#現在ログイン中のユーザIDをparamsで取得。
def group_params
params.require(:group).permit(:name, user_ids: [] )
end
#現在グループIDをparamsで取得。
def set_group
@group = Group.find(params[:id])
end
end
class MessagesController < ApplicationController
#このページ全てにset_groupメソッドを適用。
before_action :set_group
#messages/indexページでメッセージが作られる。
#また@group.messagesも定義。
def index
@message = Message.new
@messages = @group.messages.includes(:user)
end
#imessages/createページでメッセージが保存されると、 group_messagesにリダイレクト。
def create
@message = @group.messages.new(message_params)
#非同期通信の設定
if @message.save
respond_to do |format|
format.html {redirect_to group_messages_path(@group), notice: 'メッセージが送信されました'}
format.json
end
#imessages/createページでメッセージが保存失敗すると、 'メッセージを入力してください。'
else
@messages = @group.messages.includes(:user)
flash.now[:alert] = 'メッセージを入力してください。'
render :index
end
end
private
def message_params
params.require(:message).permit(:content, :image).merge(user_id: current_user.id)
end
#現在グループIDをparamsで取得。
def set_group
@group = Group.find(params[:group_id])
end
end
class UsersController < ApplicationController
#インクリメンタルサーチの設定
def index
@users = User.where('name LIKE(?)', "%#{params[:name]}%" ).where.not(id: current_user)
respond_to do |format|
format.json
end
end
#もしcurrent_userがアップデートしたら、rootにpath。
def update
if current_user.update(user_params)
redirect_to root_path
else
#アップデートできなかったら、テキスト内容そのまま残して編集。
render :edit
end
end
private
#userはname, :emailで認証されている。
def user_params
params.require(:user).permit(:name, :email)
end
end
コントローラ記述のポイント
可読性を重視。ロジックはモデルに定義し、後から呼び出すこと。
このポイントに従うと、2箇所モデルに定義すべきロジックがあります。
(3)messages_controller.rb
if @message.save
respond_to do |format|
format.html {redirect_to group_messages_path(@group), notice: 'メッセージが送信されました'}
format.json
end
else
@messages = @group.messages.includes(:user)
flash.now[:alert] = 'メッセージを入力してください。'
render :index
end
(4)users_controller.rb
@users = User.where('name LIKE(?)', "%#{params[:name]}%" ).where.not(id: current_user)
respond_to do |format|
format.json
end
次回は、コードを見やすくするためのリファクタリングについてまとめます。
とはいえ、実装前には沢山の準備が必要なのですね。
調べてみたところ、実際の仕事では下記の準備が必要です。
https://qiita.com/chocode/items/fd51dd8f561e2a0fbd70
映像制作の時も、
企画書、絵コンテ、ロケハン、キャスト・スタッフアサイン、香盤表、キャスト・スタッフリスト、機材リスト、移動手段、ケータリング等の準備がありました。
そう考えると、何でも準備は必要なのですね。
基礎を知って、繰り返して、要領を得る。。
早くアプリ開発においても、スムーズに準備できるようになりたーい!
現在23時15分。今日は、このへんでアプトプット終了。
明日も早起きするぞー!!