質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1345閲覧

ルーティングがGETなのに削除できてしまう

hakoco_12

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/09/05 11:14

編集2019/09/05 11:41

#やりたいこと
@postの投稿内容を削除したい
#疑問点
削除はできており、エラーが起きているわけではないのですが...

投稿内容を削除する、すなわちデータベースの内容を変更する必要があるときは、メソッドをpostにしなければならないと学んだのですが、postコントローラーのdestroyアクションへのルーティングをGETにしているにもかかわらず投稿が削除できてしまっています。

イメージ説明

routes

1Rails.application.routes.draw do 2 get 'contacts/new' 3 get 'contacts/create' 4 5 get 'blog' => "posts#index" 6 get 'blog/new' => "posts#new" 7 post 'blog' =>"posts#create" 8 get 'blog/:id' => "posts#show" 9 get 'blog/:id/destroy' => "posts#destroy" 10 get 'blog/:id/edit' => "posts#edit" 11 post 'blog/:id/update' => "posts#update" 12 13 get 'access' => "top#access" 14 get 'lesson' => "lesson#index" 15 get 'profile' => "top#profile" 16 get 'users/show' 17 18 root 'top#index' 19 20 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 21end

html

1<h1>edit</h1> 2<%= form_tag({contoller: :posts, action: :update}, method: :post) do %> 3 <div class="new-post-submit"> 4 <textarea name="title" rows="1" cols="80"><%= @post.title %></textarea> 5 <textarea name="content" rows="8" cols="80"><%= @post.content %></textarea> 6 <input type="submit" value="edit"> 7 </div> 8<% end %> 9<%= link_to "削除", "/blog/#{@post.id}/destroy" %>

postscontroller

1class PostsController < ApplicationController 2 def index 3 @posts = Post.all 4 end 5 6 def show 7 @id = params[:id] 8 @post = Post.find_by(id: params[:id]) 9 end 10 11 def new 12 end 13 14 def create 15 params[:title] 16 params[:content] 17 @post = Post.new(title: params[:title], content: params[:content]) 18 @post.save 19 redirect_to("/blog") 20 end 21 22 def edit 23 @post = Post.find_by(id: params[:id]) 24 end 25 26 def update 27 @post = Post.find_by(id: params[:id]) 28 @post.title = params[:title] 29 @post.content = params[:content] 30 @post.save 31 redirect_to("/blog") 32 end 33 34 def destroy 35 @post =Post.find_by(id: params[:id]) 36 @post.destroy 37 redirect_to("/blog") 38 end 39end

どうしても気になったので、どなたかわかる方がいらっしゃいましたらご回答よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

postコントローラーのdestroyアクションへのルーティングをGETにしているにもかかわらず投稿が削除できてしまっています。

はい、getで書けばGETアクセスで動作させられます。

ただし、ネットで過去に見た半分ネタみたいな話で、「削除リンクをGETで動くようにしておいてあったら、ページを読みに来たGoogleのクローラが削除用のリンクをすべてたどって、コンテンツが綺麗サッパリ消滅していた」なんて事故もあるように、GETアクセスは冪等(ページを表示する以上の変化がない)ことが前提となっています。そういう意味合いで、削除機能はPOSTDELETEなどのメソッドで構築するのが適切です。

投稿2019/09/05 11:45

編集2019/09/05 11:45
maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hakoco_12

2019/09/05 23:59

そういうリスクがあるのですね! 丁寧に回答していただきありがとうございます。 POSTやDELETEを使うようにいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問