掲示板の編集・削除機能の実装
ルーティングの設定
resources :boards do resources :comments, only: %i[create], shallow: true end
コントローラの設定
app/controllers/boards_controller.rb
def edit; end def update if @board.update(board_params) redirect_to @board, success: t('defaults.message.updated', item: Board.model_name.human) else flash.now['danger'] = t('defaults.message.not_updated', item: Board.model_name.human) render :edit end end def destroy @board.destroy! redirect_to boards_path, success: t('defaults.message.deleted', item: Board.model_name.human) end private def find_board @board = current_user.boards.find(params[:id]) end # このメソッドはset_boardという命名でも良い。
@board.destroy!を使っている理由は、削除処理は「必ず成功するもの」だからだ。 また。save save! は、処理が失敗したときの挙動が違います。 前者はfalse を返し、後者は例外を返します。 例えば、掲示板作成でタイトルを入力漏れし、falseが帰ってきたら、エラー表示箇所を訂正してまた作成を試みます。掲示板作成は「失敗する可能性がある」処理です。 一方、削除の処理は失敗する余地がない処理です。この処理が失敗したときは、意図的に処理を止めてデバッグが必要になります。
ビューを作成
app/views/boards/_board.html.erb
<%= render 'crud_menus', board: board if current_user.own?(board) %>
app/views/boards/_crud_menus.html.erb
<ul class='crud-menu-btn list-inline float-right'> <li class="list-inline-item"> <%= link_to edit_board_path(board), id: "button-edit-#{board.id}" do %> <%= icon 'fa', 'pen' %> <% end %> </li> <li class="list-inline-item"> <%= link_to board_path(board), id: "button-delete-#{board.id}", method: :delete, data: { confirm: t('defaults.message.delete_confirm') } do %> <%= icon 'fas', 'trash' %> <% end %> </li> </ul>
app/views/boards/show.html.erb
<%= render 'crud_menus', board: @board if current_user.own?(@board) %>
英語のように読み解くと、 crud_menusパーシャルを呼び出しパーシャル内のboardに@boardを代入する。 もし、current_userのidが@boardのuser_idと一致していたら
current_userと掲示板作った人が一致しているか確認している。
編集のリンクを編集ページのパスに変更、削除のリンクを削除確認アラートを表示させるように、部分テンプレートを変更する。
掲示板編集のビューを追加する app/views/boards/edit.html.erb
<% content_for(:title, @board.title) %> <div class="container"> <div class="row"> <div class="col-lg-8 offset-lg-2"> <h1><%= t('.title') %></h1> <%= render 'form', { board: @board } %> </div> </div> </div>
参考文献