Ruby on Rails [学習記録-第9章-]

#ツイート保存時にユーザー情報を追加する処理を記述
* 今回はツイートの保存時に投稿したユーザーのidをテーブルに保存する処理を記述する。

#current_user
* deviseでログイン機能を実装すると、current_userというヘルパーメソッドを使用することができる。
* 現在ログイン中のユーザーのレコードを、userクラスのインスタンスとして取得することができるメソッド。
* usersテーブルでのidカラムの値が1のアカウントでログインしている場合、`current_user`は`User.find(1)`と同じ意味を持つ。

```rb:apps_controller.rb
  class AppsController < ApplicationController

    before_action :move_to_index, except: :index

    def index
      @apps = App.page(params[:page]).per(5).order("created_at DESC")
    end

    def new
    end

    def create
      Tweet.create(name: tweet_params[:name], image: tweet_params[:image], text: tweet_params[:text], user_id: current_user.id)
    end

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

    def move_to_index
      redirect_to action: :index unless user_signed_in?
    end
  end
```
* tweet_paramsはハッシュの形なので、tweet_params[:キーの名前]とすることでそのキーのバリューの値を取ることができる。

#マイページのルーティングを記載
* マイページのパスは他のページと違って、ユーザーごとにパスが異なる。
* マイページを表示する際にはusersコントローラのshowアクションを使う。

```rb:route.rb
Rails.application.routes.draw do
  get     '/コントローラ名/:id'        => 'コントローラ名#show'
  #:idの部分には表示するユーザーページのユーザーのidが入る
end
```
```rb:route.rb
Rails.application.routes.draw do
  devise_for :users
  root  'tweets#index'
  get   'tweets'      =>  'tweets#index'
  get   'tweets/new'  =>  'tweets#new'
  post  'tweets'      =>  'tweets#create'
  get   'users/:id'   =>  'users#show'    #Mypageへのルーティング
end
```
* このようにルーティングを定義することによって、パスの一部をコントローラにパラメーターというハッシュ形式で値を送る事ができる。これはparamsというメソッドを使用することで取得することが可能。コントローラ内でparams[:id]と記述することにすれば/users/:idの:id部分の情報を使用することができる。
* マイページを表示するためにusersコントローラのshowアクションを動かすルーティングを設定しました。続いてusersコントローラを作成し、showアクションを定義する。

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

```bash:
$ rails g controller users
# users_controllerと関連するファイルを作成
```

* 作成したusers_controllerにshowアクションを定義。
* 必要な情報はニックネームとログイン中のユーザーのツイートの2つ。
* ビューに情報を受け渡す際にはインスタンス変数（@付きの変数）をコントローラのアクション内で定義
* それぞれを`@nickname`と`@tweets`という変数に定義する。

```rb:users_controller.rb
class UsersController < ApplicationController
  def show
    @nickname = current_user.nickname
    @apps = App.where(user_id: current_user.id).page(params[:page]).per(5).order("created_at DESC")
  end
end
```
#マイページ用のビューファイルを作成
* usersコントローラにshowアクションを定義することができたので、アクションに対応するビューファイルを作成する。
* app/views/usersディレクトリに`show.html.erb`ファイルを作成。

```html:show.html.erb
<div class="contents row" >
  <p><%= @nickname %>さんの投稿一覧</p>
  <% @tweets.each do |tweet| %>
    <div class="content_post" style="background-image: url(<%= tweet.image %>);">
      <%= simple_format(tweet.text) %>
      <span class="name"><%= tweet.name %></span>
    </div>
  <% end %>
  <%= paginate(@tweets) %>
</div>
```

#マイページへのリンクを作成
```html:
 //省略
 <header class="header">
  <div class="header__bar row">
    <h1 class="grid-6"><a href="/">App</a></h1>
    <% if user_signed_in? %>
      <div class="user_nav grid-6">
        <span><%= current_user.nickname %>
          <ul class="user__info">
            <li>
              <a href="/users/<%= current_user.id %>">マイページ</a> #マイページへのリンク
              <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
            </li>
          </ul>
        </span>
        <a class="post" href="/app/new">投稿する</a>
      </div>
    <% else %>
      <div class="grid-6">
        <%= link_to "ログイン", new_user_session_path, :class => 'post' %>
        <%= link_to "新規登録", new_user_registration_path, :class => 'post' %>
      </div>
    <% end %>
  </div>
</header>
 //省略
```