【rails】タスクにユーザ名を追加する
新たにタスクを登録する時にログインしているユーザの名前も追加できる様にします。
本日やること
- tasksテーブルに「user_id」を追加する
- ストロングパラメータにuser_idを追加する
- アソシエーションを設定する
- 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)を追加します。
ストロングパラメータについては別記事でも解説しています。
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が空なので、手動で値を入力します。
これで完成です。Sign_Upでtest_user以外のアカウントを作成し、タスク登録を行うと新しいユーザ名が表示されると思います。