〜Ruby on Rails5 〜 devise(Gem)編

 

〜ユーザーを登録しよう〜

devise(Gem)

 ユーザー管理機能を簡単に実装できるGem

rails g devise:installコマンド

 追加したdeviseというGemの『設定関係に使用するファイル』を自動で生成するコマンド。

rails g deviseコマンド

 deviseによるユーザー機能の対象を指定することで、モデルとマイグレーションの生成やルーティングの設定などをまとめて処理する。

 ※テーブルはこのコマンドでは作成されないため、『rails db:migrate』コマンドで、マイグレーションを実行しテーブルを作成する必要がある。また、テーブル・カラム情報を変更しているため、ローカルサーバーを再起動する必要がある。

user_signed(サインド)_in?メソッド

 deviseを導入している時に使えるメソッドで、ログインしているかどうかの判定を行うことができる。ユーザーがログインしていればtrueを、ログアウト状態であればfalseを返してくれる。使用方法は『if user_signed_in?』とifの条件式に部分に記載することで使用できる。

 また、link_toで作成したリンクは、デフォルトでGETメソッドを使用しているため、DELETEメソッドを使用する際は、methodオプションで『:delete』を指定が必要。また、GETメソッドを使用する場合は、methodオプションを省略することができる。

リダイレクト

 『本来受け取ったパスとは別のパスへ転送する』機能のこと。アクションに処理を持たせて実行した上で、そのパスのビューを返すのではなく別の意図したパスにユーザーを転送させることができる。また転送するためには、未ログインユーザーを判別する必要があるため、『user_signed_in?』『unless』を用いる。

unless(アンレス)

 『if』と同様に、条件式の返り値で条件分岐して処理を実行するRubyの構文。『if』と『unless』の違いは、返り値が『true』の時にelseまで処理されるのが『if』で、返り値が『false』の時にelseまで処理されるのが『unless』です。Railsではリダイレクト処理に『redirect(リダイレクト)_to』メソッドを使う。

redirect(リダイレクト)_toメソッド

 Railsでリダイレクト処理を行う際に使用するメソッド。コントローラー等での処理が終わった後、アクションに対応するビューファイルを参照せずに、別ページへリダイレクトさせることができる。

redirect_to action: :リダイレクト先となるアクション名

except(エクセプト)オプション

 berore_actionで使用できるオプション。『除外する』という意味があり、この後に指定したアクションは、事前処理を実行されない。

rails g devise: viewsコマンド

ビューファイルを生成することができるコマンド。

 deviseを実装すると、自動でログインとサインアップ画面が生成されるが、ビューファイルとしては生成されない。そのためビューファイルを変更したい場合は、『rails g devise:views』コマンドを実行し、ビューファイルを生成する必要がある。

rails g migrationコマンド

 マイグレーションを生成するコマンド。すでに作成されたテーブルの内容を変更する際に使用する。このコマンドは、指定するファイルの名前によって、どのようなテーブル操作を行うかを自動で記述する。『rails g migration Addカラム名To追加先テーブル名 追加するカラム名:型』と記述することで、テーブルにカラムを追加する際に必要なコードが記述された状態で、マイグレーションが生成される。Addの後の『カラム名』の部分は、厳密なカラム名を入力する必要はないが、ファイル名を見ただけ動作を理解できる名前にしておくのが適切。

スネークケースとキャメルケース

 それぞれ単語の区切り方を表したもの。スネークケースは、単語の区切りを『アンダースコア』で表し、キャメルケースは、単語の区切りを『大文字』で表す。

 使い分け方(Railsの慣習的な命名規則

 ⑴クラス名       →アッパーキャメルケース(先頭から大文字)

 ⑵メソッド名・変数名  →スネークケース

mexlength(マックスレングス)オプション

 text_field(ヘルパーメソッド)につけることができるオプションで入力できる最大文字数を指定することができる。

 【例】maxlengthオプション

<div class="field">
  <%= f.text_field :nickname, autofocus: true, maxlength: "6" %>
</div>

devise_parameter_sanitizer(サニタイザー)メソッド

 deviseにおけるparamsのようなメソッド。diviseのUserモデルに関わる『ログイン』『新規登録』などをリクエストからパラメーターを取得できる。

 また、permitメソッドと組み合わせることで、diviseに定義されているストロングパラメーターに対し、自分で新しく追加したカラムも指定して含めることができる。

private
def configure_permitted_parameters #メソッド名は慣習
 # deviseのUserモデルにパラメーターを許可
 devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])

また、deviseに定義されているpermitメソッドと、Railsで初めから使用できたpermitメソッドとは異なるものである。

# paramsのpermitメソッド
params.require(:モデル名).permit(:許可するキー)

# devise_parameter_sanitizerのpermitメソッド
devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])

 第一引数の処理名には、deviseですでに設定されている『:sign_in』『:sign_up』『:account_update』が使用でき、それぞれサインイン時やサインアップ時、アカウント情報更新時の処理に対応している。

 

 処理名の種類

 ⑴:sign_in       → サインイン(ログイン)の処理を行う時

 ⑵:sign_up      → サインアップ(新規登録)の処理を行う時

 ⑶:account_update  → アカウント情報更新の処理を行う時

application_controller.rbファイル

  全てのコントローラーが継承しているファイル。deviseにストロングパラメーターを追加するコードは、deviseのコントローラーが編集できないため、『application_controller.rb』に記述する。

 

 

〜マイページを実装しよう〜

current_userメソッド

 Gemのdeviseを導入しているため、使用できるメソッド。現在ログインしているユーザーの情報を取得できる。

 現在、ビューから送られてくる情報が入ったparamsと、curret_userメソッドで取得したログイン中ユーザーのidを統合した上で、ツイートを保存させる必要がある。

merge(マージ)メソッド

 ハッシュを統合させる時に使用するRubyのメソッド。

 tweet = { name: "たなか", text: "test", image: "test.jpeg"}
uid = { user_id: "1"}
tweet.merge(uid)
#=> {:name=>"たなか", :text=>"test", :image=>test.jpeg, :user_id=>"1"}

アソシエーション

 モデルを利用したテーブル同士の関連付けのこと。アソシエーションをモデルに定義することで、そのモデルに紐づく別のモデルの情報へアクセスできるようになる。

has_manyメソッド

 Userモデルの視点で考えると、あるユーザーの作成した投稿は複数個ある状態。つまり、1人のユーザーは複数の投稿を所有している。この状態のことを『has_many』の関係と言い、今回の場合は、『 User has many Tweets』の状態であると言える。

 この関連付けをするため、userと他のモデルとの間に『1対多』の繋がりがあることを示すのが『has_many』メソッドです。

belongs_toメソッド

 1つの投稿は、1人のユーザーが投稿したもの。つまり1つの投稿を複数人が投稿できないため、投稿は必ず1人のユーザーに所属する。この状態のことを『belongs to』の関係といい、今回の場合は、『 Tweet belongs to User』の状態であると言える。

 Tweetモデルと他のモデル(User)との間に『1対1』の繋がりがあることを示すのが『belongs_to』メソッドです。

N+1問題

 アソシエーションを利用した場合に限り、データベースへのアクセス回数が多くなってしまう問題のこと。これはアプリケーションのパファーマンス低下につながる。

 通常、Tweet.allなどでデータを取得する際は、1度のアクセスで済むが、今回のように、ツイートが複数存在する一覧画面に、それぞれユーザー名を表示するケースだと、tweetsに関連するusersの情報の取得に、ツイート数と同じ回数のアクセスが必要になる。

 この問題を解決する方法として、『includes(インクルード)』メソッドを使用する。

includes(インクルード)メソッド

 引数に指定された関連モデルを1度のアクセスでまとめて取得できるメソッド。書き方は、『モデル名.includes(:紐づくモデル名)

テーブルから不要なカラムを削除する方法

 削除する場合は、『テーブルからカラムを削除するためのマイグレーションを作成』してカラムの削除を実行する。

 【例】カラムを削除するコマンド

 #マイグレーションを制作
% rails g migration Removeカラム名From削除元テーブル名 削除するカラム名:型

 

〜表示順を並び替えよう〜

orderメソッド

 モデルで使用できる『ActiveRecoud』メソッドの1つで、テーブルから取得してきた複数のレコード情報を持つインスタンスの、並び順を変更するメソッド。

 引数には、『"並び替えの基準となるカラム名 並び順"』のように『並び替えの基準となるカラム名』と『並び順』を半角スペースで繋げて指定する。

 インスタンス = モデル名.order("並び替えの基準となるカラム名 並び順")

 並び順にはそれぞれASC{アスク(昇順)}DESC{デスク(昇順)}の2種類がある。

 

〜複数ページで利用する表示の一部をまとめよう〜

部分テンプレート

 ビューファイルにおいて繰り返し使用するコードを切り出し、再利用する仕組みのこと。

_◯◯.html.erbファイル

 部分テンプレートとして切り出すときに作成するファイル。テンプレート自体のファイル名は、命名規則として『アンダースコア_』を先頭に記述する。

render(レンダ)メソッド

 部分テンプレートを呼び出す際に利用するメソッド。また呼び出す部分テンプレートは、『partial(パーシャル)』というオプションで指定する。

partial(パーシャル)オプション

 renderメソッドで使用できるオプション。partialというオプションをつけ、部分テンプレート名を指定することで、該当する部分テンプレートを表示できる。

locals(ローカルズ)オプション

 renderメソッドで使用できるオプション。localsというオプションをつけることで、部分テンプレート内でその変数を使えるようになる。

 <% render partial: "sample", locals: {post: "hello!"} %>

 

〜ツイートにコメントを投稿しよう〜

ルーティングのネスト

 ネストとは、ある記述の中に別の記述をして、親子関係を示す方法。ルーティングにおけるネストは、あるコントローラーのルーティングの中、別のコントローラーのルーティングを記述すること。

 ネストをさせる1番の理由は、アソシエーション先のレコードのidをparamsに追加してコントローラーに送るため

 

〜投稿検索機能を実装しよう〜

collection(コレクション)とmember(メンバー)

 ルーティングを設定する際に使用できる。生成させるルーティングのURLと実行されるコントローラーを任意にカスタムできる。

 【例】correctionで定義した場合

 Rails.application.routes.draw do
resources :tweets do
collection do
get 'search'
end
end
end 

 【例】collectionのルーティング

 prefix          Verb    URI
search_tweets GET /tweets/search(.:format)

 【例】memberで定義した場合

 Rails.application.routes.draw do
resources :tweets do
member do
get 'search'
end
end
end

 【例】memberのルーティング

 prefix          Verb     URI
search_tweet GET /tweets/:id/search(.:format)

  URLの指定先が、correctionは『:id』なし、memberが『:id』ありとなる。

whereメソッド

 モデルが使用できる、ActiveRecordメソッドの1つ。『モデル.where(条件)』のように、引数部分に条件を指定することでm、テーブル内の『条件に一致したレコードのインスタンス』を配列の形で取得できる。

 引数の条件には、『検索対象となるカラム』と必ず含めて、条件式を記述する。

 【例】whereメソッド

 モデル.where(’検索対象となるカラムを含めた条件式’)

  また、whereメソッドを連続して記述することによって、複数の条件に一致したレコードを取得することもできる。

 【例】

 # idが3未満のtweetsテーブルのインスタンスを配列で取得
 [1] pry(main)> Tweet.where('id < 3')
=> [#<Tweet id: 1, image:  〜省略>#<Tweet id: 2, image: ~省略>]
 # idが3未満かつuser_idが1のtweetsテーブルのインスタンスを配列で取得
 [2] pry(main)> Tweet.where('id < 3').where('user_id: 1')
=> [#<Tweet id: 1, image:  〜省略> 

LIKE句

 曖昧な文字列の検索をするときに使用するもので、whereメソッドと一緒に使う。

 ※テーブルとのやりとりに関するメソッドはモデルに置く

 

 曖昧文字列について

 文字列    意味

  %     任意の文字列(空白文字列含む)

  _     任意の1文字

 

 実行サンプル

 実行例            詳細

 where('title LIKE(?)', "a%")   aから始まるタイトル

 where('title LIKE(?)', "%b")   bで終わるタイトル

 where('title LIKE(?)', "%c%")   cが含まれるタイトル

 where('title LIKE(?)', "d_")     dで始まる2文字のタイトル

 where('title LIKE(?)', "_e")     eで終わる2文字のタイトル

 

Railsのエラーを解消しよう〜

デバッグ

 任意でない処理(バグ)を見つけること。Railsで行うデバッグ作業の1つに、『pry-rails』というGemの機能を利用する方法がある。

pry-rails

 Railsにおけるデバッグ用のGem。『binding.pry(バインディングプライ)』という機能を使えるようになり、『binding.pry』という記述をソースコードの中にすると、『binding.pry』が存在する箇所でRailsの処理を一時停止し、その状態でコンソールを起動できる。