Day 16:add administrator only with Devise
updated at Dec 4, 2019
from Qiita: deviseだけで管理者を追加したい
Environment
- Ubuntu 18.04
- Ruby:2.51
- Rails: 5.2.2
- gem: 'devise'(ログイン等の機能用), 'kaminari'( pagination )
- DB: PostgreSQL
実作業
テーブルにadminカラム追加
# rails g migration Addカラム名Toテーブル名 カラム定義
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
class AddAdminToStudent < ActiveRecord::Migration[5.2]
def change
add_column :students, :admin, :boolean,default: false
end
end
rails db:migrate
admin権限を確認付与
stu = Student.find(1)
stu.admin?
=>false
stu.admin = true
stu.save
stu.admin?
=>true
admin属性が追加され、またadmin?メソッドを使用できるようになっている。
adminのみが全データを見れるようにする
admin以外は、自分のデータしか見れないようにしたい。
# users_controller.rb
def index
if current_student.admin?
@students = Student.page params[:page]
else
@student = current_student
end
end
# app/views/student
<tbody>
<% if current_student.admin? %>
<% @students.each do |student| %>
<tr>
<td><%= student.name %></td>
<td><%= student.email %></td>
<td><%= display_name student.gender %></td>
<td><%= display_age student.age %></td>
<td><%= student.opinion %></td>
<td><%= link_to 'Show', student %></td>
<td><%= link_to 'Edit', edit_student_path(student) %></td>
<td><%= link_to 'Destroy', student, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<td><%= link_to 'New Exam Result', new_exam_result_path(student_id: student.id) %></td>
<td><%= link_to 'New Club Student', new_club_student_path(student_id: student.id) %></td>
</tr>
<% end %>
<% else %>
<tr>
<td><%= @student.name %></td>
<td><%= @student.email %></td>
<td><%= display_name @student.gender %></td>
<td><%= display_age @student.age %></td>
<td><%= @student.opinion %></td>
<td><%= link_to 'Show', @student %></td>
<td><%= link_to 'Edit', edit_student_path(@student) %></td>
<td><%= link_to 'Destroy', @student, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<td><%= link_to 'New Exam Result', new_exam_result_path(student_id: @student.id) %></td>
<td><%= link_to 'New Club student', new_club_student_path(student_id: @student.id) %></td>
</tr>
<% end %>
</tbody>
</table>
<% if current_student.admin? %>
<%= paginate @students %>
<% end %>