Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

初心者がRailsでWEBアプリを作ります(3)

More than 1 year has passed since last update.

目標:昨日より成長できる初心者エンジニアへ。

初めてのWEBアプリ制作の工程を公開することで、次回もっとスムーズに作れるよう、今回の記録を残したいと思います。

ここで実装前にやること(3)をまとめます。

はじめの方向性を間違えないよう、
@enzenさんの投稿"しっかり設計する"より、やるべき筋道を洗い出しました。
最後に、機能の詳細を設計をまとめたいと思います。

機能の詳細を設計します。

<具体的には>主にコントローラの設計をしておきます。

さて、ここで今まで勉強してきたアプリの復習。
コントローラに記述するべきことは何だったでしょう??

コントローラに記述すること

  • インスタンス変数の定義。(@message = Message.newなど)
  • paramsの定義。
  • ログインの設定
  • 非同期通信の設定
  • リダイレクトの設定
  • アラートの設定

今回作成するコントローラは4つ。

(1)application_controller.rb
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
(2)groups_controller.rb
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
(3)messages_controller.rb
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
(4)users_controller.rb
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分。今日は、このへんでアプトプット終了。

明日も早起きするぞー!!

mio158cm
<歴1ヶ月半のプログラミング初心者です> 夜型、早起きで頑張ります!(>o<) アウトプットの勉強で投稿させていただきます。 ruby on rails, html, css, haml, scss, BEM, Javascript, jQuery, mysql, AWS,S3
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away