Rails Tutorial に自己紹介文の機能拡張をしてみた

## 目的
　Rails Tutorialに自己紹介文の機能を追加する。
　テストは今回書いてないデス。

## 実装
　まずはブランチをきる。

```
$ git checkout -b user-profile
```

　Userモデルにprofile属性を追加する。
　Micropostの時と同じようにデータはtext型にする。

```
$ rails g migration add_profile_to_users profile:text
```

　あとで、検索機能を追加することを想定して、インデックスを追加。

```db/migrate/timestanp_add_profile_to_users.rb

class AddProfileToUsers < ActiveRecord::Migration[5.1]
  def change
    add_column :users, :profile, :text
    add_index :users, :profile
  end
end
```

　自己紹介文の文字数を160文字以内に制限する。

```app/models/user.rb
class User < ApplicationRecord
  .
  .
  .   
  validates :password, presence: true, length: { minimum: 6 }, allow_nil: true
  validates :profile, presence: true, length: { maximum: 160 }
  .
  .
  . 
end
```

　Faker::Cat.breedを使って、自己紹介文にどの猫の種類が好きか追加する。

```db/seed.rb
User.create!(name:  "Example User",
  .
  .
  .
             activated_at: Time.zone.now,
             profile: "I like black cat.")

99.times do |n|
  name  = Faker::Name.name
  email = "example-#{n+1}@railstutorial.org"
  password = "password"
  profile = "I like " + Faker::Cat.breed + "." 
  .
  .
  .
              activated_at: Time.zone.now,
              profile: profile)
  .
  .
  .
followers.each { |follower| follower.follow(user) }
```
　データベースをリセットして、いろんなユーザー生成する。

```
$ rails db:migrate:reset
$ rails db:seed
```
　Profile画面に自己紹介文を表示させる。

```app/views/users/show.html.erb
<% provide(:title, @user.name) %>
  .
  .
  .   
    </section>
    <p><%= @user.profile %></p>
    <section class="stats">
  .
  .
  . 
</div>  
```

<img width="253" alt="スクリーンショット 2018-08-27 23.53.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/251046/af87c2db-005c-3981-0ed7-88ee67d202c6.png">

　profileの属性を許可する。

```app/controllers/users_controller.rb
class UsersController < ApplicationController
  .
  .
  .
  private
  
    def user_params
      params.require(:user).permit(:name, :email, :password,
                                  :password_confirmation, :profile) 
    end
  .
  .
  .
end
```

　Settingsで自己紹介文を編集できるようにする。

```app/views/users/edit.html.erb
<% provide(:title, "Edit user") %>
  .
  .
  .     
      <%= f.email_field :email, class: 'form-control' %>

      <%= f.label :profile %>
      <%= f.text_area :profile,  class: 'form-control', placeholder: "160文字以内で入力" %> 
  .
  .
  .
</div>
```
<img width="631" alt="スクリーンショット 2018-08-27 14.25.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/251046/c557f153-1159-0c10-049c-4737ebf34a2c.png">
　ユーザー一覧ページで自己紹介文を表示するようにする。

```app/views/users/_user.html.erb
<li>
  <%= gravatar_for user, size: 50 %>
  .
  .
  .
  <% end %>
  <p><%= user.profile %></p> 
</li>
```
<img width="743" alt="スクリーンショット 2018-08-27 23.53.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/251046/55de5894-a84a-4235-6e2a-561509dfc56f.png">

　できたので、push。

```
$ git add -A
$ git commit -m "Add user's profile"
$ git checkout master
$ git merge user-profile
$ git push
```

herokuにもpush。以上で終わりデス。

```
$ git push heroku
$ heroku pg:reset DATABASE
$ heroku run rake db:migrate
$ heroku run rake db:seed
$ heroku restart
```

## 感想
　Rails Tutorialを一通りやって、初めて機能追加をやった。
　今回、ちょっとした機能追加だったが、form_forやvalidatesなどRailsについてのいい復習になり、勉強になった。
　写経だけでなく、自分の頭で考えて機能追加をすると、よりRailsの理解が進むと思った。