devise ページネーション など　基礎


#####忘れがちな余談
コントローラーのアクション内に定義されたインスタンス変数はそのアクションのビューで使用することができる。

書くカラムに保存されている値のことを<strong>プロパティ値</strong>と言います。

###ヘルパーメソッド
Railsでは予めviewでHTMLタグを出現させたり、テキストを加工するためのメソッドが用意されています。
これらをヘルパーメソッドと言います。
simple_format　改行で`<br>`を付与、文字列を`<p>`で囲ってくれるメソッド
form_tag　　　　フォームを出現させるメソッド
link_to　　　　　aタグを出現させるメソッド
などがあります。


CSSファイルの読み込みはHTMLのheadタグ内の`stylesheet_link_tag`から読み込まれます。

require_treeは、引数として与えられたディレクトリ以下のCSSファイルをアルファベット順に全て読み込むという意味がある。`.`は引数であり、カレントディレクトリを表します。

```application.css
require_tree .
```

####MVC
ルーティング→コントローラー→モデル→ビュー の順に処理が行われるのがRailsです。
モデル・ビュー・コントローラーを使用して処理を行うシステムをそれぞれの頭文字をとってMVCと言います。


####フォーム
フォームとはユーザーが情報を入力し、その情報をサーバーに送信するためのもの。
HTMLのコード内にform要素を作成し、その中にinput要素やtextarea要素を入れることで作成できます。
formタグでもフォームは作成できるが、セキュリティの観念上、Railsではヘルパーメソッドである、form_tag, form_for, form_withを使うのが推奨されている。


ユーザーがフォームに入力した値は、コントローラー内では`params`という変数に入っています。
`params`はハッシュオブジェクトだと考えましょう。
ビューでフォームに入力された情報は、コントローラーにキーと一緒にパラメーターとして送られます。
このパラメーターは`params`というメソッドを使うことで取得することができます。
使用方法は

```
params[:キー名]
```
form内のinputやtextareaにあるname属性の値がキー名に当たります。

####ストロングパラメーター
ストロングパラメーターとは、指定したキーを持つパラメーターのみを受け取るようにするもの。
不正な情報などを受け取らないようにするのでセキュリティを強化できます。
`任意のストロングパラメーター名_params`というメソッドを作成することで定義ができます。

```xxxxx.rb
private
def sample_params　　　　###任意のストロングパラメーター名_params
  params.permit(:キー名, :キー名)
end
```
メソッドの中には`params.permit`と記述して受け取ることを許可するパラメーターのキー名を続けます。
permitメソッドは、ビューから送られてきた情報のハッシュである`params`から後に続けたキーの名前がバリューと共に新たなハッシュとして生成します。


####privateメソッド
class内でprivateと記述するとそれ以降に定義したメソッドはclassの外部から呼び出せなくなります。
外部から呼ばれたら困るメソッドを守れたり、private以下は読まなくて良くなるのでコードの可読性が上がります。


####image_tag
Railsではロゴやバナーなど固定して表示したい画像はapp/assets/images以下に置くことが普通です。

```sample.html.erb
<%= image_tag 'sample.png' %>
```

####pry-rails
pry-railsとは、Gemの一つであり、Rails向けのデバッグツールです。
これを使うことによりバグの有無を確認したり処理を途中で止めてソースコードが正しいか確認できます。
特に使う機能が`binding.pry`です。
これを使うことによって処理を途中で止めて、かつrailsコンソールと同じことができます。止めたいソースコードのところで`binding.pry`を記述しましょう。変数の値を取得したり、`binding.pry`を複数個設置することによって処理が正しく行われているか確認することができます。
処理を再開させたい場合はターミナルで`exit`を入力します。

```sample_controller.

def create
  Sample.create(sample_params)
binding.pry
end

private
def sample_params
  params.permit(:name, :image, :text)
end
```

投稿画面で投稿する。
（new.html.erb)

するとターミナルでコンソールが立ち上がる

```ターミナル.
[1] pry(#<SamplesController>)> params
=> <ActionController::Parameters {"authenticity_token"=>"DnHBKql5oQq9lARgEnK8gQiFAhnTvIVa1XH8d13u7tuVjDUGWPM1eEjVbF44iFms57+VE7+vT3SYUePDy3lwWQ==", "name"=>"aa", "image"=>"https://kumamoto.photo/archives/_data/i/upload/2019/03/13/20190313172208-2113bf9d-la.jpg", "text"=>"dddddddd", "controller"=>"samples", "action"=>"create"} permitted: false>
[2] pry(#<SamplesController>)> params[:text]
=> "dddddddd"
```

コンソールで`params`と入力すると投稿画面で入力した値がキー名と共にパラメーターとして出力される。

`exit`と入力すると処理が再開する。



####ルートパス
URLにパスを付けない、ホスト名だけのURLのことをルートパスと言います。
routes.rbでの書き方は、

```routes.rb
root 'コントローラー名#アクション名'
```


####orderメソッド
インスタンスを並び替えるメソッドです。
全てのレコードを取得してきた場合レコードを並び替えられます。

```
.order("カラム名 順序の指定”)
```
ASCは昇順　日付で言うと古い方から
DESCは降順　日付で言うと新しい方から


####ページネーション
ページを分割させてくれるもの。１ページ当たりの表示件数を決められます。
gem kaminariを利用することで実装できます。

`page`メソッド
このメソッドでページ数を指定できます。全体のページ数でなく、今何ページにいるかと言うことです。

`per`メソッド
１ページあたりの表示件数を決められます。

```sample_controller.
@samples = Sample.order("id ASC").page(params[:page]).per(10)
```

pageメソッドの引数は、kaminari を導入した際に、モデルクラスにpageというキーが追加されておりそれを記述しています。そのキーの値はビューで指定したページの番号となります。


####devise-ログイン機能-
ログイン機能を簡単に実装できるgemです。

Gemfileにdeviseを記述して
bundle install後
アプリのディレクトリで
`rails g devise:install`と叩くと
設定ファイルが作成されます。
`config/initialize/devise.rb`と`config/locales/devise.en.yml`です。

アカウント作成のためのモデルを作らなければいけないので
`rails g devise モデルクラス名`でモデルなどの関連ファイルを作成します。
モデルファイルや、マイグレーションファイルが作成されます。
それと同時に、`routes.rb`に
```
devise_for :モデル名の複数形
```
が追記されます。
devise_forはログイン周りに必要なルーティングを一気に生成してくれるdeviseのヘルパーメソッドです。

current_user, user_signed_in?などのヘルパーメソッドも使えるようになっています。

`rails g devise:views`でデバイスのビューファイルを作成できます。


####Prefix
ルーティングのパスが入った変数のことです。

####unless文
if文の逆で、条件式が偽の時にする処理を記述します。

```
unless 条件式
　偽の時に実行する処理
end

条件分岐が１行の場合は、１行で記述できる。
puts "ログインしてください" unless user_signed_in?
###ログインしてなければ（つまり偽）"ログインしてください"が表示される
```

###redirect_toメソッド
Railsでは基本的にアクションの処理が終わるとアクションと同名のビューに遷移しますが、`redirect_toメソッド`を使えば別のアクションを実行したり、ビューに遷移させたりできます。

```
redirect_to { action: :index }
```
キーに`action:`をとり、値にアクションの名前のシンボル型をとります。
例えば、`:index`などです。{}は省略できます。

###before_actionメソッド
コントローラー内のアクションが実行する前に実行したいメソッドを指定できます。シンボル型のメソッド名で指定できます。
オプションで`except`や`only`があり、アクションごとに制限をかけられます。

###テーブルにカラムを追加

```
rails g  migration Addカラム名Toテーブル名　カラム名:型
```

####configure_permitted_parametersメソッド
deviseでログイン機能を実装した際、パラメーターの受け取り方が普通とは違います。ストロングパラメーターは初期状態では、メールアドレスとパスワードのみ受け取る設定がされています。追加するにはconfigure_permitted_parametersメソッドを使います。

```application_controller.rb
before_action :configure_permitted_parameters, if: :devise_controller?

def configure_permitted_parameters
  devise_parameter_sanitizer.permit(:追加したいアクション名, keys: [:追加するキー])
end
```

```application_controller.rb
class ApplicationController < ActionController::Base
#  protect_from_forgery with: :exception
 before_action :configure_permitted_parameters, if: :devise_controller?

 def configure_permitted_parameters
  devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
 end
end
```