リクエストに対応する処理(コントローラー)

・リクエストに対応する処理は、コントローラーに記述。

・リクエストに対応する処理をまとめて用意しておく。ルーティングからリクエストを受け取り、処理を行った後に、クライアントにレスポンスを返す。

・MVC(モデル・ビュー・コントローラー)における橋渡しの役割もある。
他のMVCの役割と連携してデータを取得したり受け渡しを行ったりすることで、レスポンスを完成させる。

・Railsに必要なファイルを生成するには、rails gコマンド

・railsアプリに追加で必要なファイルなどを生成するために使用するコマンド。rails gに続けて、生成したいファイルの種類とファイル名を記述する。

% rails g ファイルの種類 生成するファイル名

g = generate

・コントローラー(と、それに付随するファイル)を一度に作成してくれるコマンド= rails g controller

% rails g controller コントローラー名

# コントローラー名は、複数形を使用する

コントローラ上では、

Running via Spring preloader in process 24861
    create  app/controllers/posts_controller.rb
    invoke  erb
    create    app/views/posts                       # ビューファイルも作成
    invoke  test_unit
    create    test/controllers/posts_controller_test.rb
    invoke  helper

・・・特定のコントローラに対するビュー(上記ではpostsコントローラのビュー)も同時に作成

・rails gコマンドで生成したファイル一式をすべて削除するコマンド= rails dコマンド

・1つのファイルだけではなく、関連するファイルも一気に削除してくれる。
(d = destroy)

% rails d ファイルの種類 削除するファイル名

2020/09/15

次の記事(コントローラのアクション)

_____応用

・コントローラーとビューを同時に作成する際
コントローラーとビューを同時に作成する方法。

% rails g controller messages index

# コントローラー作成時に、コントローラー名に続けてアクション名を指定。

・messagesコントローラーにindexアクションが作られる。
・viewsのmessagesフォルダにindex.html.erbファイルが作られる。

2020/10/09

______________________

Ruby on RailsにおけるController(コントローラー):
「ルーティングによって処理されたリクエストを受け取り、ビューファイルなどをレスポンスとして返却する」機能。
・・・Action Controllerという仕組みを搭載しているから。

・Action Controller

Ruby on Railsのアプリケーションにおいて、コントローラーの機能を実現するために必要なオブジェクトのこと。

______________________

リクエストは、まずルーティングで処理。
ルーティングで、「どのコントローラーの、どのアクションを実行するか」の判断がなされ、コントローラーのアクションと呼ばれるメソッドが実行される。

アクションではリクエストに対する処理を行ったあと、最終的にレスポンスを返却する。

処理の例:「DBからデータを取得する」や「ワード検索(曖昧検索)」等。

class TweetsController < ApplicationController

 def search
   # DBからデータを取得する
   @tweets = Tweet.all

   # もし検索ワードがあれば、検索ワードを含むデータのみを曖昧検索で取得し、@tweetsに代入し直す
   if params[:keyword] != ""
     @tweets = Tweet.where('text LIKE(?)', "%#{params[:keyword]}%")
   end
 end

end

アプリケーションの仕様によって複雑で長文になる場合がある。
・・・DRYを考慮しながら、コントローラーの役割と直接関係のない処理を別のファイルに移動する必要がある。

上記の例では、モデルであるtweet.rbに移動することができる。

# Tweetsコントローラ

class TweetsController < ApplicationController
 def search
   # 処理はmodelへ移動した
   @tweets = Tweet.search(params[:keyword])
 end
end
# Tweetモデル

class Tweet < ApplicationRecord
  def self.search(search)
    if search != ""
      Tweet.where('text LIKE(?)', "%#{search}%")
    else
      Tweet.all
    end
  end
end

Tweet.where('text LIKE(?)', "%#{params[:keyword]}%"):曖昧検索処理
モデルであるTweetクラスの中にsearchというクラスメソッドを新しく作り、その中にメソッドを呼び出すことで処理を実行する。

>>処理をモデルへ切り出すことで、可読性を高めることができる。

コントローラーの役割:「リクエストを受け取り、レスポンスを返すこと」であり、細かいデータの処理を行うことではない。これはモデルの役割。

______________________

レスポンスにはHTMLなどのビューファイルを返却する場合や、「JSON」というデータを返却する場合がある。
HTMLなどのビューファイルを返却することを「レンダリング」と呼ぶこともある。

・レンダリング

指定したHTMLなどのビューファイルを画面に描画すること。
具体的には、Ruby on Railsで登場するindex.html.erbなどのビューファイルを画面に表示する。

・JSON(ジェイソン)

データを扱う場合のフォーマットのこと。フォーマット自体は数種類ある。
動作が軽いことや、モダンなフロント言語と親和性が高く管理がしやすいなどのメリットから、JSONが用いられることが多い。

・・・レスポンスとしてデータを返却する場合は、JSONというフォーマットを使用する場合が多い。

______________________

・7つのアクションを使用する場合

7つのアクションのルールに沿って、indexなどのアクションを使用するとレスポンスは自動的にindex.html.erbに設定される。

class TweetsController < ApplicationController
  def index
              # index.html.erbがレスポンスとして返却される
  end
end

・render template:を使用する場合

任意で設定する場合は、renderメソッドを使用して、返却するHTMLファイルを指定する。

class TweetsController < ApplicationController
  def render_top_page
    render template: "tests/index"
  end
end

・render json:を使用する場合

json:{ post: post }のように指定すると、{ post: post }というデータをJSON形式で返却することができる。

class PostsController < ApplicationController
  def create
     post = Post.create(content: params[:content], checked: false)
     render json:{ post: post }
  end
end

ビューファイルであればHTMLを、データであればJSONを返却するのが主流。

______________________

・サービスクラス(service class)

コントローラー内のコードの可読性を高めるために用いる概念。
モデルの記述の肥大化を避ける意味でも、複雑な処理はサービスクラスに切り出したい。

app/servicesのように、appディレクトリ配下にservicesというディレクトリを作成し、〇〇.rbファイルを作成する。
・・・モデルからサービスクラスへ処理を切り出す。モデルに定義した切り出したいメソッドを書き換える。

class 〇〇Service
   def メソッド名
             # 切り出したメソッド
   end
end

サービスクラスで定義したメソッドを、コントローラーで呼び出す。

# 例えば、、、、

class TweetsController < ApplicationController
~省略~

 def search
   @tweets = SearchTweetsService.search(params[:keyword])   # サービスクラスで定義したメソッド
 end

~省略~
end

______________________

クッキーも見ておく・・・

2020/11/08

この記事が気に入ったらサポートをしてみませんか?