【学習メモ】Ruby / Ruby on Rails

# Ruby
Rubyについて学んだ知識をまとめます
### 変数展開
文字列の中で、#{変数名}とすることで、変数を代入している値に置き換えて、文字列に含めることができる
変数展開を用いる際は、ダブルクォーテーションで囲む必要がある
### elsifの注意点
elsifは必要な数だけ並べることができますが、複数の条件に合致したとしても、実行されるのは最初に合致した条件の処理のみである。
そのため条件の順番を間違えると、期待した分岐がなされないことがある
### each文 書き方
配列.each do |変数名|
  処理
end
変数名は好きな名前をつけられるが、配列の変数名の単数形にすることが多い
### シンボルとは
シンボルとは、文字を「"」や「'」で囲む代わりに、先頭に「:」をつけた書き方のことをいいます
文字列とシンボルは厳密には異なりますが、基本的には同じように使用することができる
### 真偽値を返すメソッドについて
if文で使うような条件式をreturnすると、その条件式の結果として得られる真偽値（trueまたはfalse）を返すことができる
真偽値を返すメソッドは、メソッド名の末尾に「?」をつける慣習がある
ex) return Date.sunday?
### キーワード引数とは
メソッドを呼び出す際、キーワード引数を用いた書き方をすることで、呼び出し側で引数を明記することができる
通常のメソッドの書き方に加えて、
① 定義側で、引数の後にコロンを付ける
② 呼び出し側で、値の前に引数名を書く
とすることで、キーワード引数を持つメソッドを書くことができる
### 入力を受け取る
変数 = gets.chomp ... 文字列
変数 = gets.chomp.to_i ... 数値
### オーバーライド
親クラスにあるメソッドと同じ名前のメソッドを子クラスで定義すると、メソッドを上書きすることができる
これをメソッドの「オーバーライド」と呼ぶ
オーバーライドをすると、子クラスのインスタンスは親クラスのメソッドではなく、子クラスで定義したメソッドを呼び出すようになる
### super
オーバーライドしたメソッドの中で「super」とすることで、親クラスの同名のメソッドを呼び出すことができる
あくまでメソッドを呼び出しているので、親クラスのメソッドの定義に合わせて、superに対して引数を渡す必要がある
### クラスメソッド
クラスに対して呼び出すメソッド(クラス内で定義されたメソッド)をクラスメソッドという
def クラス名.メソッド名
「クラス名.メソッド名」で呼び出せる
※インスタンスに対して呼び出すメソッドはインスタンスメソッド
ex) 
 menu = Menu.new
      puts menu.info
# Ruby on Rails
### ルーティングの記法
get "URL" => "コントローラー名#アクション名"
例えば、ブラウザから「localhost:3000/home/top」というURLが
送信されたとき、homeコントローラーのtopアクションで処理される
URLが同じ名前でも「get」と「post」では別のルーティングとして扱われる
### ページ作成のコマンド
「rails generate controller コントローラ名 アクション名」
「rails generate controller」は「rails g controller」と省略可能
同じ名前のコントローラがすでにある場合は、そのコントローラ名を含むコマンドを使うことはできない
### erbファイル
index.html.erbのようなerbという形式のファイルでは、<% %>で囲むことで、HTMLファイルの中にRubyのコードを記述することができる
「erb」とは「Embedded Ruby（埋め込みRuby）」の略
<% %>は何も表示されないので変数の定義などを記述する
<%= %>で変数の値などを表示できる
### マイグレーションファイルとモデルの作成
マイグレーションファイルは、データベースに変更の指示を行うためのファイルである
以下のコマンドでマイグレーションファイルとモデルの作成ができる
「rails g model テーブル名(単数形) カラム名:データ型」
ex) rails g model Post content:text
マイグレーションファイルのみを作成する際は「rails g migration ファイル名」
changeメソッド内にカラムを追加する処理を追記する場合は「add_column :テーブル名, :カラム名, :データ型」と記述する
### rails consoleでデータベース操作
コンソールを開きコマンドを実行することで、テーブルにデータ追加等の操作がきる
newメソッドでモデルからインスタンスの作成ができる
ex) post = Post.new(content:"Hello World!")
作成したインスタンスをテーブルに保存するには、saveメソッドを用いる
「モデル名.find_by(カラム名: 値)」と記述する
ex) post.save
find_byメソッドで特定の値を取得できる
ex) post = Post.find_by(id:3)
destroyで削除
ex) post.destroy
### 共通のレイアウトをまとめる
views/layouts/application.html.erbに共通のレイアウトをまとめておくことができる
application.html.erbでは、<%= yield %>というコードに各ビューファイルが代入され、application.html.erbの一部としてブラウザに表示される
### link_to メソッド
画面遷移のコマンド
ex) <%= link_to("表示する文字", "URL") %>
また、第三引数に「{method: "post"}」を追加することで、「post」として定義されているルーティングにマッチするようになる
ex) <%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>
### URLにIDを含める
ルーティングのURL部分に「:」を用いて「posts/:id」と指定することで、「/posts/1」でも「/posts/2」でも指定のアクションにいくようにすることができる
ex) get "posts/:id" => "posts#show"
### 変数params
コントローラのアクション内では、ルーティングで設定したURLの「:id」の値を取得することができる
その値はparamsという変数にハッシュとして入っており、params[:id]とすることで、その値を取得することができる
ex) @post = Post.find_by(id:params[:id])
### create
フォームに入力された値を送信するために、<input>タグの両方にname属性を指定する必要がある
name属性の値が送信されるハッシュのキーになるため、データの内容が分かるようなname属性をつける必要がある
ex) < input name="name" >
### form_tag メソッド
「form_tag(送信先のURL) do」のように送信先のURLを指定することで、フォームに入力されたデータをDBに送信することができる
ex)
<%= form_tag("送信先URL") do %>
  フォームの中身
<% end %>
### redirect_to メソッド
他のURLに転送（リダイレクト）するには、redirect_toメソッドを用いる
redirect_toは「redirect_to(URL)」とすることで、そのページに転送することができる
ex) redirect_to("posts/index")
### order メソッド
order(カラム名: 並び替えの順序）のように使用する
並び替えの順序には、昇順（:asc）と降順（:desc）のどちらかを指定する
ex) @posts = Post.all.order(created_at: :desc)
### バリデーション
不正なデータがDBに保存されないようにする仕組み
validates 検証するカラム名, {検証する内容}
と記述する
ex) validates :content, {presence: true, length:{maximum: 140}}
重複のチェックは「uniqueness: true」と記述する
ex) 
### render メソッド
renderメソッドを用いることで、別のアクションを経由せずに、直接ビューを表示することができる
render("フォルダ名/ファイル名")のように表示したいビューを指定する
renderメソッドを使うと、redirect_toメソッドを使った場合と違い、そのアクション内で定義した@変数をビューでそのまま使うことができる
### エラーメッセージ
saveメソッドを呼び出した際にバリデーションに失敗すると、Railsでは自動的にエラーメッセージが生成される
@post.errors.full_messagesの中に、エラー内容が配列で入っている
### flash
ページ上に1度だけ表示されるメッセージをフラッシュという
アクションで変数flash[:notice]に文字列を代入すると、flash[:notice]をビューで使うことができる
ex) flash[:notice] = "表示したい文字列"
### 変数session
ページを移動してもユーザ情報を保持し続けることができる
sessionに代入された値はブラウザに保存される
ex) session[:user_id] = @user_id
また、データベースを変更するときに加えsessionの値を変更する場合でも post を用いる
### applicationコントローラ
全てのコントローラで共通する処理はapplicationコントローラにまとめることができる
各コントローラの全アクションで共通する処理がある場合には、before_actionを使うbefore_actionを用いることで、アクションが呼び出される際に必ずbefore_actionの処理が実行される
### whereメソッド
ある条件に合致する「複数の」データを取得するには、whereメソッドを用いる
ex) posts = Post.where(user_id: self.id)
### HTML要素に対してLink_toメソッドを用いる
<%= link_to(URL) do %>と<% end %>の間にHTML要素を書くことで、その部分をリンクにすることができる
### countメソッド
likesテーブルからデータの件数を取得するには、countメソッドを用いる
ex) Like.where(post_id: 1).count
### authenticateメソッド
has_secure_passwordメソッドを有効にすると、authenticateメソッドを使えるauthenticateメソッドは渡された引数をハッシュ化し、password_digestの値と一致するかどうかを判定してくれる
ex) @user.authenticate(params[:password])