rails 独学して軽くにちゃんまとめつくる

インターン中大学生のブログ

ぐるぐる回って何をしたいのかが変わってく。今はマッチングサイトを作りたい、もしくは論文のキュレーションサイトかな。

(delete)削除機能を実装する

専用のビューはない。index の名前の横に delete ボタンを実装することになる。ただ、管理者権限を作成し、管理者だけが削除できるようにする箇所がややこしいので注意。あと、delete ボタンは html でmethod : delete という風にするので初めてなら注意。

 

 

①管理者権限のカラムを作ってコマンドライン

②seed.rbで管理者権限を1人に与えてコマンドライン

③現在のユーザーが管理者ならパーシャルの横にdelete ボタンを表示させ、クライアント側で制御

④コントローラー側でadmin_user というメソッドを作り、サーバー側でも制御

 

 

コマンドライン

$ rails generate migration add_admin_to_users admin:boolean

 db/migrate/ [timestamp]_add_admin_to_users.rb

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

 コマンドライン

rails db:migrate

 

モデルを扱ったらバリデーションかseedのどちらかを意識するのが定石。今回はseedを変更し、admin を true にする。

 

db/seeds.rb

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

コマンドライン

  $ rails db:migrate:reset

 $ rails db:seed

 

ここでストロングパラメーターを意識する。ストロングパラメーターのあるおかげで何者かが admin: true を送り込もうとしてもこれのおかげでカットされる。

 

 

ビュー

このif の条件の2つめは自分自身のアカウントの横にdelete を持たせないことを要請している。事実管理者ユーザーの横には delete ボタンが存在しない。

app/views/users/_user.html.erb

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

 

セッションヘルパーに current_user? を定義しておく

def current_user?(user)
    user == current_user
  end

 

コントローラー

def destroy
    User.find(params[:id]).destroy
    flash[:success] = "User deleted"
    redirect_to users_path
  end

さらに、サーバー側でのdelete の制御として admin_user メソッドをbefore_action に加えておく。

before_action :admin_user, only: :destroy

 

private

def admin_user

   redirect_to(root_path) unless current_user.admin?

end