初学者が押さえておきたいRailsの文法まとめ

## はじめに
これだけは覚えておきたいというRailsの用語や概念について自分用の備忘録としてまとめてみました。基本的なものだけを紹介しているので、より詳しく知りたいものについては適宜ご自身で調べながら読み進めて頂けると幸いです。

また、こちらはプログラミング初学者がまとめた記事となりますので間違っていることがあるかもしれません。その際はご指摘等頂けると幸いです。宜しくお願いします。

## 本記事の内容
Railsでよく使われる文法の解説。

## 対象者

Rubyの基礎文法を学んだことはあるが、Railsについては勉強したことがない初学者の方。

## アプリの基本設定

生成ファイルの設定に関しては、` config/application.rb `に記述をする
`config.generators`ブロック内に必要な設定を記述する


`code:application
```ruby:application.rb
 config.generators do |g|
    g.skip_routes true
    g.assets false
    g.helper false
    g.test_framework false
 end
```

- 参考：Railsガイド
    - [ワークフローをカスタマイズする](https://railsguides.jp/generators.html)

## i18nによる日本語化対応
`config/application.rb `に
```ruby:config/application.rb
config.i18n.default_locale = :ja
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
```
`config/locales/activerecord/ja.yml`
`config/locales/views/ja.yml`
の2ファイルを作成する

- **基本的な使い方の例**

```ruby:config/locales/activerecord/ja.yml
ja:
   activerecord:
     models:
       user: 'ユーザー'
     attributes:
       user:
         email: 'メールアドレス'
         password: 'パスワード'
```

## デコレーターの導入方法
```ruby:Gemfile
gem 'draper'
```
`bundle install`
`rails generate draper:install`
`rails generate decorator ○○(モデル名)`

```ruby:viewファイル
 <div>
     <%= current_user.decorate.full_name %>
 </div>
```
viewでは`.decorate.メソッド`として記述し、`decorate`のメソッドを呼び出す
```ruby:decoratorファイル
class UserDecorator < Draper::Decorator
   delegate_all
   
   def full_name
     "#{object.first_name} + #{object.last_name}"
   end
 end
```

**モデルではデコレーターに書く理由**
 - モデルにはDBにアクセスするような処理のみを記載することで肥大化を防ぐ。
 - ビューロジックはモデルには書かない

## フラッシュメッセージの設定

`layouts/_flash.html.erb`にファイルを用意し、それを読み込む

```ruby:layouts/_flash.html.erb
<% flash.each do |key, value| %>
    <p class="alert alert-<%= key %>">
        <%= value %>
    </p>
 <% end %>
```

次に`app/views/layouts/application.html.erb`レイアウトファイルでパーシャルを読み込む

```ruby
<%= render 'shared/flash_message' %>
<%= yield %>
```

`app/controllers/application_controller.rb`に下記を追加

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
   add_flash_types :success, :info, :warning, :danger
end
```

コントローラではrender時はflash.now、redirect_to時はそのまま続けて書く

```ruby:controllers
redirect_to login_path, success: "ユーザー登録が完了しました"
flash.now[:danger] = "ユーザー登録に失敗しました"
```

**redirect_to/renderの違い**
- redirect_toはredirect先のviewを読み込む前にviewに対応するアクションを通す
- renderはviewに対応するアクションを通さない

**両者の違いは、処理がもう一度コントローラーを通過するかしないか**

## アソシエーション
アソシエーションの定義例
`bundle exec rails g model board user:references`
`references型`を用いることで、
 インデックスをはる
 外部キー制約
などを実現できる
`bundle exec rake db:migrate:status`で現在のマイグレーション状態を確認

（バリデーションの例）
`validates :title, presence: true, length: {maximum: 255}`

## シードファイル
`db/seeds.rb` に初期データを投入し、`rails db:seed`で実行
ダミーデータを作る際に使われるのが`Faker`という`gem`
いかが`seed`と`faker`を使ってダミーデータを作る例

```ruby:db/seeds.rb
10.times do
   User.create(
       first_name: Faker::Name.first_name,
       last_name: Faker::Name.last_name,
       email: Faker::Internet.email,
       password: '12345678',
       password_confirmation: '12345678'
   )
 end
 
 20.times do |index|
   Board.create(
       user: User.offset(rand(User.count)).first,
       title: "タイトル#{index}",
       body: "本文#{index}"
   )
 end
```
`bundle exec rails db:seed`で実行する

## レンダリングについて
コントローラーに下記のような記述がありレンダリングする場合、
```ruby:app/controllers/board_controller.rb
def index
   @boards = Board.all
end
```
よくある書き方としては、
```ruby:app/views/index.html.erb
<% @boards.each do |board| %>
    <%= render partial: 'board', locals: { board: board } %>
<% end %>
```
ただ、これだと`@bords`の数だけレンダリングするのでパフォーマンスが悪い
そこで、
```ruby:app/views/index.html.erb
 <%= render partial: "board", collection: @boards %>
```
とすることでパフォーマンスが良くなる
さらに、
```ruby:erbファイル
 <%= render @boards %>
```
として省略できる
`render`で`localsオプション`をしようしたときは、`partial`をつけないとエラーになる
```ruby
<%= render partial: 'ファイル名', locals: { '部分テンプレート内で使う変数': '変数に入れる値' } %>
<!-- 例 テンプレート内の「hoge」という変数に「こんにちは」が代入される -->
<%= render partial: 'hoge', locals: { hoge: 'こんにちは' } %>
<!-- 例 テンプレート内の「hoge」という変数に呼び出し元で定義した変数「hoge」が代入される-->
<%= render partial: 'hoge', locals: { hoge: hoge } %>
```
参考：https://pikawaka.com/rails/partial_template

- 参考サイト
    - [パーシャルについて](https://pikawaka.com/rails/partial_template)