1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-06-19

#ツイート保存時にユーザー情報を追加する処理を記述

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

#current_user

  • deviseでログイン機能を実装すると、current_userというヘルパーメソッドを使用することができる。
  • 現在ログイン中のユーザーのレコードを、userクラスのインスタンスとして取得することができるメソッド。
  • usersテーブルでのidカラムの値が1のアカウントでログインしている場合、current_userUser.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>
 //省略
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?