Day 16:devise で管理者を追加する

/
#rails#devise

Environment

  • Ubuntu 18.04
    • Ruby:2.51
    • Rails: 5.2.2
      • gem
        • devise: ログインなどの機能用
        • `kaminari: pagination
    • DB: PostgreSQL

実作業

テーブルにadminカラム追加

undefined
1
# rails g migration Addカラム名Toテーブル名 カラム定義
2
rails g migration AddAdminToStudent admin:boolean

boolean型

真理値の「真 = true」と「偽 = false」という 2 値をとるデータ型のこと。Ruby では偽は false と nil で、それ以外が true になる。言語や DB によっては、1 と 0 だったり、違うので注意。

マイグレーションファイルを編集

boolean 型と定義する際は、デフォルト値を設定しないといけない。admin のデフォルト値に引数 false を渡し、デフォルトでは admin 権限がない、と指定する。

/db/migrate/20190328011407_add_admin_to_student.rb
1
class AddAdminToStudent < ActiveRecord::Migration[5.2]
2
def change
3
add_column :students, :admin, :boolean,default: false
4
end
5
end

rails db:migrate

admin権限を確認付与

undefined
1
stu = Student.find(1)
2
stu.admin?
3
=>false
4
stu.admin = true
5
stu.save
6
stu.admin?
7
=>true

admin 属性が追加され、また admin?メソッドを使用できるようになっている。

adminのみが全データを見られるようにする

admin 以外は、自分のデータしか見られないようにしたい。

users_controller.rb
1
def index
2
if current_student.admin?
3
@students = Student.page params[:page]
4
else
5
@student = current_student
6
end
7
end
app/views/student.html.erb
1
<tbody>
2
<% if current_student.admin? %>
3
<% @students.each do |student| %>
4
<tr>
5
<td><%= student.name %></td>
6
<td><%= student.email %></td>
7
<td><%= display_name student.gender %></td>
8
<td><%= display_age student.age %></td>
9
<td><%= student.opinion %></td>
10
<td><%= link_to 'Show', student %></td>
11
<td><%= link_to 'Edit', edit_student_path(student) %></td>
12
<td><%= link_to 'Destroy', student, method: :delete, data: { confirm: 'Are you sure?' } %></td>
13
<td><%= link_to 'New Exam Result', new_exam_result_path(student_id: student.id) %></td>
14
<td><%= link_to 'New Club Student', new_club_student_path(student_id: student.id) %></td>
15
</tr>
16
<% end %>
17
<% else %>
18
<tr>
19
<td><%= @student.name %></td>
20
<td><%= @student.email %></td>
21
<td><%= display_name @student.gender %></td>
22
<td><%= display_age @student.age %></td>
23
<td><%= @student.opinion %></td>
24
<td><%= link_to 'Show', @student %></td>
25
<td><%= link_to 'Edit', edit_student_path(@student) %></td>
26
<td><%= link_to 'Destroy', @student, method: :delete, data: { confirm: 'Are you sure?' } %></td>
27
<td><%= link_to 'New Exam Result', new_exam_result_path(student_id: @student.id) %></td>
28
<td><%= link_to 'New Club student', new_club_student_path(student_id: @student.id) %></td>
29
</tr>
30
<% end %>
31
</tbody>
32
</table>
33
<% if current_student.admin? %>
34
<%= paginate @students %>
35
<% end %>