Railsのメソッドや関連知識

#はじめに

メモ用

一旦メモして保存、記事にできるような具体的に実装に伴いデーターを以降。まとめていく。

#ビュー周り


##ページネーションした時に使用する
ページネーションとは長い文章を複数のページに分割して、
各ページへのリンクを並べアクセスしやすくすること。

```
gem 'kaminari'
bundle install
```

`kaminari:pageメソッド`
`kaminari:perメソッド`
`kaminari:paginateメソッド` ページネーションのリンクを表示したい時に使う

```ruby:
 @hoges = Hoge.page(params[:page]).per(5)


###ビューファイルで使用する
<%=paginate(@hoges) %>コントローラで定義した変数をあてる
```

##renderメソッド
アクションを経由せずに、直接ビューを表示
。
renderメソッドにpartialオプションをつけることで、呼び出す部分テンプレートを指定できます。今回の場合、partialオプションには"tweet"が指定されています。
また、localsというオプションを用いると部分テンプレート内でその変数を使えるようになります。

```ruby:
render partial: "ranking/ranking", locals: { product: product}
```


##form_tagメソッド
モデルに基づかないformを作るときに使う（検索フォームなど）
→検索は別にモデルに編集やインスタンスの追加をする必要はない

```ruby:viewファイルで設定
form_tag("飛ばすURL")　do
end
```

##form_forメソッド
モデルに紐づいたフォームを作るときに使用する(特定の「モデル」を編集・追加するためのフォームを生成するヘルパーメソッド)
CRUD処理を実装するときは確実にform_forを利用すると考えてもいいくらいらしい。
特定のテーブルにレコード(モデルクラスのインスタンス)だけを新規作成、更新するときに利用する。

■form_for: 任意のモデルに基づいたformを作るときに使う（投稿フォームなど）
→フォームに入力した情報をモデルを通じて、テーブルに追加・編集する

```ruby:
<%= form_for　@user, url: "/users/", html{method: :post} do |f| %>

<%= from_for モデルオブジェクト, url:"/飛ばすURL/", html{method: :何でひろうか}　do |f| %>
…
<% end %>

```
<img width="819" alt="スクリーンショット 2019-05-08 16.20.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385774/bf6e1314-4988-cf38-0bdb-f4edb53074e1.png">

>form_for内で使うメソッドは、f.htmlタグ名 :カラム名の形で指定します。

他にも色々ある。公式リンク

http://railsdoc.com/form


##link_toメソッドの使い方
この形が通常型。その名の通り、ページのリンクを貼り付けたいヘッダーでよく使う。
ルートはgetをデフォルトで読み込む。

```　ruby:viewファイルで設定
 link_to '表示したい文字', "URL" , method: :hirou, date: {cofirm:"mozi"}
```



#モデル周り

##よく使うデーター型と区分け
|種類|意味|
|---|----|
|①text　|＝　文字列　　　
|②string　|＝　短い文字列
|③integer |= 整数（使い方調べ中）
|④float |＝ 浮動小数
|⑤decimal |= 精度の高い小数
|⑥datetime |= 日時
|⑦timestamp |= より細かい日時
|⑧time |= 時間
|⑨date |= 日付
|⑩binary |= バイナリデータ
|11boolean |= Boolean型
|1２references |= 外部キーカラムに指定する

##制約の種類

主キー制約

|種類|意味|種類|
|---|----|---|
| null: false|空だと弾かれる|NOT NULL制約|
|foreign_key: true|外部キーのidが正しくないとだめ|外部キー制約|
|unique: true|重複したカラムの投稿を制限|一意性規約|
||||
||||

##制約の一例

```ruby:
t.string :name,               null: false, unique: true, index: true

```




##中間テーブルの設定

```ruby:
class num1 < ActiveRecord::Base
  has_many :num1_num2
  has_many :num2, through: :num1_num2
end

class num2 < ActiveRecord::Base
  has_many :num1_num2
  has_many :num1, through: :num1_num2
end

# 中間テーブル
class Num1Num2 < ActiveRecord::Base
  belongs_to :num1
  belongs_to :num2
end
```
##多対多の関係を構築した事によって使えるメソッド


```ruby:
理解してから追加していく
```


#リレーション

```
ここも追加してみる
```

##validate登録

不正なデーターがデータベースに保存されないようにチェックする仕組み。
基本の形　validates :検証するカラム,{検証する内容}
バリデーションで指定する制限の間に[,]をつける事で複数指定できる

●空の投稿を防ぐバリデーション

```ruby:app-modelの中にある
validates :text, :image, presence: true #カラムを指定
```
●文字制限をつけるバリデーション

```ruby:app-modelの中にある
validates :検証するカラム,{length: {maximum: 140}}
```
●重複がないかチェックするバリデーション

```ruby:app-modelの中にある
validates :検証するカラム,{uniqueness: true}
```


##flashとは
ページ上に1度だけ表示されるメッセージ。
アクションで設定

```ruby:app-modelの中にある
def hoge
flash[:notice] = "表示したい文字"
end
```

##アソシエーション

ブログに書いたまとめ
https://blog.hatena.ne.jp/yujiro0320/yujiro-engineer.hatenablog.com/edit?entry=17680117127104730382




#コントローラーで使用するメソッド

##requireメソッドとpermitメソッド


.requireメソッドがデータのオブジェクト名を定め、
.permitメソッドで変更を加えられる（保存の処理ができる）キーを指定。

```ruby:コントローラに記述
def create_params
 params.require(:review).permit(:name, :rate).merge(product_id: params[:product_id])
  end
end
```

参考ーhttps://qiita.com/morikuma709/items/2dc20d922409ae7ce216

##テーブルデーターの並びかえについて
データベースにある指定したモデルから**全てのデーター**を対象に　
created_atを基準としてdesc(降順）に抽出する。
逆はasc（昇順）となる。エクセルの関数でも出るよね。ASC関数とか。

```ruby:指定アクションで設定する
Model.all.order("created_at desc")
```


##特定のカラムの値から1つのデータを取得したい
指定した<:id>　にある特定のデータを受け取る。
※id = データーベースに保存した順の番号

```ruby:指定アクションで設定する
Model.find_by(id: params[:id])
```
##whereメソッド
カラムの値の文字列を全て探す
あるユーザーが投稿した内容を取り出すなどで使う。

```ruby:指定アクションで設定する
モデルクラス名.where('検索するカラム名 LIKE(?)', "検索するキーワード")
@products = Product.where('title LIKE(?)', "%#{params[:keyword]}%")
```
<img width="828" alt="スクリーンショット 2019-05-08 16.17.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385774/8749b43d-eb65-94a6-e708-3f4119506744.png">

<img width="830" alt="スクリーンショット 2019-05-08 16.17.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385774/69801020-539b-ccf3-ddbd-dd8ef52fda3f.png">


##before_actionとは

全アクションで共通する処理がある場合。アクションが呼び出される際に必ずbefore_actionの処理が実行されます。
全アクションで共通する処理を1箇所にまとめる事ができる

```ruby:application_controller 
before_action :set_current_user

  def set_current_user
      @current_user = User.find_by(id: session[:user_id])
    end

```

##redirect_to("/URL")

ビューを作らない時に使用する。アクション実行後
指定のビューに飛ばすので、ビューがなくてもエラーにならない。

```ruby:
@user = User.new(name: params[:name],email: params[:email])
   @user.save
   redirect_to("/users/#{@user.id}")
```

こんな形もある。

```ruby:
redirect_to root_path unless user_signed_in?
```

```ruby:こんな書き方もするよ。
redirect_to controller: :products, action: :index
```