Rails tutorial 10章 ユーザー削除の実装をしてみたよ

みなさんおはようございます。

つい先日rails tutorial 10章終了しました。
都度、ブログにまとめていたら大分時間がかかってしましました。笑

今日は最後のUserリソースの最後の部分、destroyアクションについてまとめたのでぜひ最後まで見ていってください。

実装計画

  1. ユーザー一覧ページを作る
  2. 管理者を一人設定する
  3. ユーザー一覧のページで管理者が閲覧している時のみ削除ボタンを実装する
  4. ユーザーを削除したら、ユーザー一覧ページへ戻る

以上の手順で進めていきます。

ユーザー一覧ページの作成

ユーザー一覧ページを作成します。
また、ここではペジネーションも実装します。

users_controllerで全員のuserを取得、viewで表示という流れになります。

users_controller.rb

  PER = 30
def index
@users = User.page(params[:page]).per(PER)
end

通常モデル内の全てのデータを取得する際はallを用いますが、今回はペジネーションを使うので上記のようになります。

次にviewの作成です。

index.html.erb

<%= provide(:title,"All users") %>
<h1>All users</h1>
<ul class="users">
<%= paginate @users %>
<%= @usres.each do |user| %>
<li>
<%= gravatar_for user, size: 50 %>
<%= link_to user.name, user %>
</li>
<% end %>
<%= paginate%>
</ul>

これで一覧ページは完成です!!!
と、言いたいところですが、コンパクトなviewにするためにrenderを使い、リファクタリングをします。

index.html.erb

<%= provide(:title,"All users") %>
<h1>All users</h1>
<ul class="users">
<%= paginate @users %>
<%= render @users%>
<%= paginate @users%>
</ul>

_users.html.erb

<%= @usres.each do |user| %>
<li>
<%= gravatar_for user, size: 50 %>
<%= link_to user.name, user %>
</li>
<% end %>

renderではファイル名でなく、変数名を指定していますが、これはRailsがuserのコレクションだなと推測し、呼び出してくれます。
これで一覧ページは完成です。

管理者の設定

管理者を実装するためにUserモデルにadminカラムを追加します。
これはuserが管理者かどうかを真偽値で返します。

iterm

rails g migration add_admin_to_users admin:boolean

次にadminのデフォルト値の設定をします。
管理者は一人だけなのでデフォルト値はfalseにします。

add_admin_to_users.rb

class AddAdminToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :admin, :boolean, default: <u>false</u>
end
end

migrateします。

rails db:migrate

最後にテストユーザーを一人管理者にします。

seed.rb

User.create!(name:  "Example User",
email: "example@railstutorial.org",
password:              "foobar",
password_confirmation: "foobar",
admin: true)

削除ボタンの実装

次に削除ボタンの実装をします。

現在のユーザーが管理者の時のみ削除ボタンを付けるのでif文を使います。

_user.html.erb

<%= @usres.each do |user| %>
<li>
<%= gravatar_for user, size: 50 %>
<%= link_to user.name, user %>
<% if current_user.admin? && !current_user?(user) %>
| <%= link_to "delete", user, method: :delete
date: {confirm: "You sure?" } %>
<% end %>
</li>
<% end %>

これで現在のユーザーが管理者の時のみ削除ボタンが現れます。

destroyアクションの実装

destoroyアクションを実装します。
最初にこのアクションはログインしていてかつ管理者でなくてはいけないのでbeforeフィルターに記述します。

users_controller.rb

class UsersController << ActiveController
before_action :is_logged_in_user, only:[:index, :edit, :update, :destroy]
before_action :admin_user, only: :destroy
・
・
・
def destroy
User.find(params[:id]).destroy
flash[:success] = "User deleted"
redirect_to users_url
private
def admin_user
redirect_to(root_url) unless current_user.admin?
end

以上で実装は完了です!!!!
最後まで見ていただきありがとうございました!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です