■ 英単語を削除できるようにする
ルーティングを確認するとdestroyアクションはword_pathのDELETEメソッドが割り当てられていました。
なぜ通常のgetルーティングではないのかと言うと、GETメソッドだとhtmlのaタグなどを使って削除を実行するリクエストが簡単に送れてしまうからなのですね。なるほど!! ※Railsガイドより
そういえばwordsコントローラを作成するとき
$ rails g controller Words new show edit delete
としたため、削除のアクションがdeleteになってました。
class WordsController < ApplicationController
def new
end
def create
@word = Word.new(word_params)
@word.save
redirect_to @word
end
def show
@word = Word.find(params[:id])
end
def edit
end
def delete #←これ
end
private
def word_params
params.require(:word).permit(:english, :japanese)
end
end
deleteを消してdestroyの中身を書いていきます。
words_controller.rb
def destroy
@word = Word.find(params[:id])
@word.destroy
redirect_to word_path
end
リダイレクト先をshow画面にしましたが、このままだと削除した単語を表示する画面に遷移させようとしてエラーになります。
なのでshowは全件表示するように変更します。
def show
@words = Word.all
end
これに伴いshow.html.erbも変更。
<h1>SHOW</h1>
<div>
<% @words.each do |word| %>
<div>
ID: <%= word.id %> |
ENGLISH: <%= word.english %> |
JAPANESE: <%= word.japanese %>
</div>
<% end %>
</div>
どの画面で削除できるようにするかまだ考えていないので、とりあえずshow画面にボタンを置いておきます。
words/show.html.erb
<h1>SHOW</h1>
<div>
<% @words.each do |word| %>
<div>
ID: <%= word.id %> |
ENGLISH: <%= word.english %> |
JAPANESE: <%= word.japanese %>
<%= button_to 'Delete', word_path(word), method: :delete %>
</div>
<% end %>
</div>
コントローラ作成時に作られたwords/delete.html.erbは要らないので削除。
http://localhost:3000/words/1にアクセスすると
ボタンが変な所にいますがとりあえず気にしない。
id=3のDeleteボタンを押してみます。
word3が消えました✨
全件表示する画面にhttp://localhost:3000/words/1でアクセスするっていうのはおかしいですね。
ちゃんと画面構成考えないと。
おわり*0 v 0
第2回 | 2020.11.9 * 最初のコントローラとWord・Chapterモデル |
第3回 | 2020.11.10 * 英単語の登録機能 |
第4回 | 2020.11.11 * 削除機能 |
第5回 | 2020.11.12 * 単語の一覧表示 |
第6回 | 2020.11.16 * 編集機能 |
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント