TECH 　DAY　4

勉強した項目：　Ruby、Rails
時間： 10:45
内容：

＊学習アウトプットです。なにぶん間違いなんかもあります。気をつけますがその際はご指摘いただけますと幸いです＊

###[params]
ビューでフォームに入力された情報は、コントローラに`キーと一緒に`パラメーターとして送られる
`params`メソッドを使用する際には`params[:キー名]`という形で使用できる

###[ストロングパラメーター]
指定したキーを持つ`パラメーター`のみを受け取るようにするもの
   `パラメーター`== `name` `image` `exit` etc

###[privateメソッド]
privateメソッド以降に定義したメソッドはclassの外部から呼び出せなくなる
**1.classの外部から呼ばれたら困るメソッドを守ることができる**
**2.可読性**  (private以下の部分は目を通さなくて良い)

```ruby
    def test
      parameter = test_params
    end

    private
    def test_params
      params.permit(:キー名, :キー名)
    end
```
###[pry-rails]
pry-railsはRails向けに開発されたデバッグツール

###[binding.pry(バインディングプライ)]
pry-railsの機能の中で最も使用 
`binding.pry`という文字列をソースコードの中に記述することで、`binding.pry`という文字列が存在する部分で`Rails`の処理を止めることができる
**処理を再開させたい場合には`exit`というコマンドを入力**
**ローカルサーバーを終了させる時は`exit!`とコマンドを入力**

```ruby

      10: def create
      11:   App.create(tweet_params)
   => 12:   binding.pry
      13: end
```

###[orderメソッド]
テーブルから取得してきたインスタンスたちを並び替えるメソッド

```ruby
  def index
    @contents = Content.all.order("id DESC")
  end
```
`orderメソッドは引数として("テーブルのカラム名 並び替える順序")という形を取る`
`ASC(昇順)`と`DESC(降順)`の2種類

###[ページネーション]
長い文章を複数のページに分割して、各ページへのリンクを並べアクセスしやすくすること、コントローラーとビューに編集をかける

###[kaminari]
RubyのGemの一種
簡単にページネーションを実装することができる

###[kaminari:pageメソッド]
ページネーションにおけるページ数を指定する
`params`の中に`page`というキーが追加されて、その値がビューで指定したページ番号となる
pageの引数は`params[:page]`

###[kaminari:perメソッド]
1ページあたりに表示する件数を指定する

```ruby

変数名 = クラスを利用して取得したレコードのインスタンス.page(params[:page]).per(ここに1ページで表示したい件数を入力)
```

###[kaminari:paginateメソッド]
ページネーションのリンクを表示したいときに使用するメソッド

###[devise]
ログイン機能を簡単に作成することができるGem

###[rails g devise コマンド]
•deviseで、ログイン機能をつける概念のモデルを作成する際に利用するコマンド
•モデルに加えて、ログイン機能のために必要なカラムが追加されるマイグレーションファイルなどが生成される

[ターミナル]

```
  $ rails g devise 作りたいモデル名
  # deviseコマンドでモデルを作成
```
###[devise_for]
devise_forはログインまわりに必要なルーティングを一気に生成してくれるdeviseのヘルパーメソッド

###[Rubyタグ]
`<%=`と`%>`で囲まれた部分で、Rubyタグは拡張子が「erb」のビューファイルで使用することができる
  →`<%=`と`-%>`もある、余計な改行がなくなる

  `<%= %>`  は返り値を出力する
　`<%   %>`  は返り値を出力しない

###[link_toメソッド]
引数を指定することで様々なリンクを生成できる
通常HTMLコード内でリンクを生成する際には`aタグ`を使用したが、`link_to`メソッドを使って記述を行うと、
HTMLコードが読み込まれる際に`aタグ`に変換され、`aタグ`と同様に、`リンク`として表示される

```ruby
  <%= link_to 'App一覧へ', '/tweets' %>
  # link_toメソッドを使ってリンクを生成
```
htmlの要素に指定できるclassなどの属性は、以下の例のように続けて`class: 'sample'`などと書くことで付与することが可能である

```ruby
  <%= link_to 'App一覧へ', '/App', class: 'sample' %>
  # 作成したaタグに`class="sample"`属性を付与
```
link_toメソッドがビューファイルとして
読み込まれる際には、以下の様なHTMLコードになる

```ruby
  <a class="sample" href="/App">App一覧へ</a>
```

###[user_signed_in?]
ユーザーがサインインしているかどうか検証するメソッド
**サインインしている場合にはtrueを返し、サインインしていない場合にはfalseを返す**

```ruby
  <% if user_signed_in? %>
    # ユーザーがサインインしている場合に実行する処理
  <% end %>
```

###[prefix]
ルーティングのパスが入る変数のことで、コントローラやビューなどで呼び出すことで、prefixに入っているパスやURL情報を取得できるもの

###[unless文]
**`if文`は、`true`の条件で返しをしてくれるが**
**`unless文`は、`false`の場合に返しをしてくれる**

```ruby
  unless 条件式
    # 条件式が偽(false)のときに実行する処理
  end
```
例

```ruby
  puts 'ログインをしてください' unless user_signed_in?
  # 以下と同義

  unless user_signed_in?
    puts 'ログインをしてください'
  end
```

###[redirect_toメソッド]
通常、アクション内の処理が終了すると自動的にアクション名と同名のビューが表示されるが、
`redirect_to`メソッドをアクション内で利用すると、そこからさらに別のアクションを実行したり、ビューに遷移できる

引数にはaction: :indexという形  **action:**がキー、 **:index**がバリュー

indexのアクションを動かす時は

```ruby
redirect_to action: :index
```

###[before_action]
コントローラで`before_action :メソッド名`と記述することで、コントローラのアクションが実行される前にそのメソッドを実行することができる

オプション`only`や`except`を使うことにより、`before_action`を実行することをアクションごとに制限をかけることもできる
**`only `  〜のみ、　`except`  〜を除く**

###[カラムを追加するマイグレーションファイルの作成]
**rails g migration Addカラム名To追加先テーブル名 追加するカラム名:型**

```ruby
  $ rails g migration AddIntroductionToUsers introduction:text
  # usersテーブルにintroductionカラムをtext型で追加するマイグレーションファイルの作成
```
「Add」「Introduction」「To」「Users」と、単語の頭文字が大文字なのがポイント

###[スネークケース]
「sample_hoge_huga」のように「_」で単語を区切る

###[キャメルケース]
「SampleHogeHuga」のように単語の頭文字を大文字にすることで単語を区切る

###[current_user]
現在ログイン中のユーザーのレコードを、userクラスのインスタンスとして取得することができるメソッド
例

```ruby
# current_userを利用して、ログインしているユーザーのデータを取得する
current_user.name
=> "naru-taka"

current_user.email
=> "naru-taka@gmail.com"
```

###[whereメソッド]
ActiveRecordメソッドのうちの一つ
`モデル.where(条件)`のように引数部分に条件を指定することで、**テーブル内の条件に一致した**レコードのインスタンスを配列型で取得できる

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

コンソール

```ruby
  [1] pry(main)> App.where('id < 3')
  => [＃<App id: 1, image: "test1.jpg", text: "速攻", created_at: "2014-12-06 00:00:00", updated_at: "2018-02-06 00:00:00", user_id: 1>,＃<App id: 2, image: "test2.jpg", text: "爆おそ", created_at: "2014-12-07 00:00:00", updated_at: "2014-12-07 00:00:00", user_id: 2>]
  # idが3未満のtweetsテーブルのインスタンスを配列で取得

  [2] pry(main)> App.where('id < 3').where(user_id: 1)
  => [＃<Tweet id: 1, image: "test1.jpg", text: "速攻", created_at: "2014-12-06 00:00:00", updated_at: "2014-12-06 00:00:00", user_id: 1>]
  # idが3未満かつuser_idが1のtweetsテーブルのインスタンスを配列で取得
```