#ツイート保存時にユーザー情報を追加する処理を記述
- 今回はツイートの保存時に投稿したユーザーのidをテーブルに保存する処理を記述する。
#current_user
- deviseでログイン機能を実装すると、current_userというヘルパーメソッドを使用することができる。
- 現在ログイン中のユーザーのレコードを、userクラスのインスタンスとして取得することができるメソッド。
- usersテーブルでのidカラムの値が1のアカウントでログインしている場合、
current_user
はUser.find(1)
と同じ意味を持つ。
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アクションを使う。
route.rb
Rails.application.routes.draw do
get '/コントローラ名/:id' => 'コントローラ名#show'
#:idの部分には表示するユーザーページのユーザーのidが入る
end
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(条件)のように引数部分に条件を指定することで、テーブル内の条件に一致したレコードのインスタンスを配列型で取得。
$ rails g controller users
# users_controllerと関連するファイルを作成
- 作成したusers_controllerにshowアクションを定義。
- 必要な情報はニックネームとログイン中のユーザーのツイートの2つ。
- ビューに情報を受け渡す際にはインスタンス変数(@付きの変数)をコントローラのアクション内で定義
- それぞれを
@nickname
と@tweets
という変数に定義する。
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
ファイルを作成。
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>
#マイページへのリンクを作成
//省略
<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>
//省略