迷い人

日々勉強。勉強の先に何か見つかるといいなぁ

【rails】タスクにユーザ名を追加する

新たにタスクを登録する時にログインしているユーザの名前も追加できる様にします。

 

本日やること

  1. tasksテーブルに「user_id」を追加する
  2. ストロングパラメータにuser_idを追加する
  3. アソシエーションを設定する
  4. task一覧画面にユーザ名を表示させる

 

1.tasksテーブルにuser_idを追加

 

まずtasksテーブルにuser_idを追加します。まずコマンドから以下の命令を実行します。

 

rails g migration AddUseridToTasks user_id:integer

 

Add追加したいカラム名To追加先テーブル名 追加するカラム名:型でカラム追加のためのマイグレーションファイルが作成されます。

 

db/migrate/2019********.rbの様なファイルがそれです。内容を確認すると以下の様になっているはずです。タイプミス等でその様になっていなければ記述を修正します。

 

(この記事を書く時に私はタイプミスしていた様で、自分で直していますw)

 

class AddUseridToTasks < ActiveRecord::Migration[5.2]
  def change
    add_column :tasks, :user_id, :integer
  end
end

 

add_colum :追加先テーブル :追加するカラム :型の型になっています。次に以下のコマンドで実際にtasksテーブルにuser_idを追加します。

 

rails db:migrate

 

2.ストロングパラメータにuser_idを追加

 

次にuser_idをtasksテーブルに登録できる様にストロングパラメータを設定します。修正するのはtasks_controllersのtasks_paramsメソッドです。

 

def task_params
 params.require(:task).permit(:content).merge(user_id: current_user.id)
end

 

もともとtasksテーブルに登録できるのはcontent(=タスクの名前)だけでしたが、現在ログイン中のユーザIDを登録できる様に.merge(user_id: current_user.id)を追加します。

 

ストロングパラメータについては別記事でも解説しています。

oyaoya1123.hatenablog.com

 

3.アソシエーションを設定する

 

次にtask一覧画面でユーザ名を簡単に登録できる様にするためアソシエーション(関連付け)の設定を行います。設定はmodels/task.rbとuser.rbに行います。

 

class User < ApplicationRecord
  #省略
  has_many :tasks
end

 

class Task < ApplicationRecord
  belongs_to :user
end

 

記述内容でなんとなく想像できると思いますが

  • 1人のユーザが複数のタスクを持つ
  • 1つのタスクは1人のユーザに属する

ということをhas_manyとbelongs_toで設定しています。この設定を行うことで、task一覧画面のtaskから簡単にusersテーブルのnameを参照することができます。

 

4.タスク一覧画面にユーザ名を追加する

 

最後にtask一覧画面にユーザ名を表示させて見ましょう。記述するのはviews/tasks/index.htnl.erbです。

 

<tbody>
 <% @tasks.each do |task| %>
  <tr>
   <td><%= task.content %></td>
   <td><%= task.user.name %></td>
   <td><%= link_to 'Show', task %></td>
   <td><%= link_to 'Edit', edit_task_path(task) %></td>
   <td><%= link_to 'Destroy', task, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
 <% end %>
</tbody>

 

<% @tasks.each do |task| %>〜<% end %>の中に<%= task.user.name %>の記述を追加します。

 

task.user.nameの部分で、tasksテーブルのカラムに入っているuser_idをキーに、usersテーブルを参照して、usersテーブルのnameにアクセスします。先ほどアソシエーションの設定を行ったことで、この様に記述することができます。

 

最後にこれまで作成したtaskについてuser_idが空なので、手動で値を入力します。

 

f:id:oyaoya1123:20190929155920p:plain

これで完成です。Sign_Upでtest_user以外のアカウントを作成し、タスク登録を行うと新しいユーザ名が表示されると思います。