🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1507閲覧

railsのdeleteリクエストについて納得できない

Harluz

総合スコア19

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/11/22 05:20

編集2020/11/29 13:37

RoRにてポートフォリオを作成中。

version

1Rails 5.2.4.4 2ruby 2.6.3

ログアウト機能を実装し、テストコードを書いている際に、なぜかログアウトした際のテストが通らないことが判明。
サーバーを立ち上げ、同じ動作をした結果、本来deleteリクエストとなるはずがgetリクエストとなっており、route errorとして判断されていた。

html

1<header class="navbar navbar-fixed-top navbar-inverse"> 2 <div class="container"> 3 <%= link_to(image_tag("header_logo.jpg", :alt => ""), root_url, id: 'logo') %> 4 <nav> 5 <ul class="nav navbar-nav navbar-right"> 6 <li><%= link_to "Home", '/' %></li> 7 <li><%= link_to "About", '/about' %></li> 8 <% if logged_in? %> 9 <li><%= link_to "Users", '#' %></li> 10 <li class="dropdown"> 11 <a href="#" class="dropdown-toggle" data-toggle="dropdown"> 12 Account <b class="caret"></b> 13 </a> 14 <ul class="dropdown-menu"> 15 <li><%= link_to "Profile", current_user %></li> 16 <li><%= link_to "Settings", '#' %></li> 17 <li class="divider"></li> 18 <li> 19 <%= link_to "Log out", logout_path, method: :delete %> 20 ↑該当箇所 21 </li> 22 </ul> 23 </li> 24 <% else %> 25 <li><%= link_to "Log in", login_path %></li> 26 <% end %> 27 </ul> 28 </nav> 29 </div> 30</header>

本来,deleteリクエストは存在せず、jsでdeleteを実装している?
(ここの知識が曖昧です。すいません)
ことから、下記の通りにapplication.jsを修正した。

applicationjs

1//= require jquery 2//= require jquery3 3//= require jquery_ujs 4//= require popper 5//= require bootstrap-sprockets 6 7//= require rails-ujs 8//= require activestorage 9//= require turbolinks 10//= require_tree .

が結果は、getとして判断された。

qiitaやネットの記事からlink_toをbutton_toにすると動作するとのこと

html

1<%= link_to "Log out", logout_path, method: :delete %> 23<%= button_to "Log out", logout_path, method: :delete %>

結果はdeleteリクエストとして動作し、rspecもlinkからbuttonに修正したところ通るようになりました。

しかし、buttonにしないと動作しない原因が分からず、納得できません。
望みとしてlinkで統一したいですし、他の開発者はどのように対応しているのか知りたいと思い投稿しました。
結論的には解決している問題ですが、どなたかご教示いただければ嬉しく思います。

networkタブの状況です
イメージ説明

試しにrails-ujsを確認した結果です
イメージ説明

回答を参考に、下記の通り修正

developmentrb

1 #config.log_level = :warn(削除) 2 #config.logger = Logger.new(STDOUT)(削除) 3--------------------------------↓↓修正後↓↓ 4 logger = ActiveSupport::Logger.new(STDOUT) 5 logger.formatter = config.log_formatter 6 config.logger = ActiveSupport::TaggedLogging.new(logger)

networkタブの状況
イメージ説明

consoleの状況
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

本来,deleteリクエストは存在せず、jsでdeleteを実装している?

はい、本来<a>タグで生成されるリンクではGETリクエストが行われます。それをJavaScript経由で乗っ取ることでDELETEなどに変換しています。

下記の通りにapplication.jsを修正した。

jquery_ujsrails-ujsjqueryjquery3など、同じ機能性を持つものを複数読み込んでしまっています。そのあたりでなにか干渉が起きていることが考えられます。

投稿2020/11/22 06:22

maisumakun

総合スコア145963

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

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

Harluz

2020/11/22 09:43

application.jsを下記の通りに修正しました。 //= require jquery3 //= require popper //= require bootstrap-sprockets //= require rails-ujs //= require activestorage //= require turbolinks //= require_tree . その後に、link_to及びbutton_toの両方を試しましたが、やはりlink_toではgetリクエストになってしまいます。
maisumakun

2020/11/22 09:45

link_toで生成した<a>タグを、HTMLとして確認するとどのようになっていますか?
Harluz

2020/11/22 11:10

下記の通りとなっております。 <a rel="nofollow" data-method="delete" href="/logout">Log out</a> 他の箇所では <a href="/users/1">Profile</a> となっており、生成されるHTMLに違いがあるようです。
maisumakun

2020/11/22 11:22

きちんとdata-methodが入っている以上、問題はJavaScriptの側のようですが、ちょっと状況が把握しきれていないです。 ブラウザのJavaScriptコンソールにエラーが出ていたりはしませんか?
Harluz

2020/11/22 12:23

46個もの数で下記のエラーが発生しております。 Failed to load resource: the server responded with a status of 500 (Internal Server Error)
maisumakun

2020/11/22 12:48

Networkタブから500になったエラーの状況を確認できますか?
Harluz

2020/11/29 06:23

返信が遅くなってしまい申し訳ありません。 devtoolsの知識について疎いので、スクリーンショットしたものを掲載しました。 stylesheetからstatuscodeが500となっております。
maisumakun

2020/11/29 10:20

500になった接続を選択して、詳細を確認してみてください。何がエラーになったかRailsが返してきている可能性があります。 (ujsの入ったJavaScriptも、500となっているようです)
Harluz

2020/11/29 12:23

詳細結果を掲載しました。 おっしゃっていることと掲載しているものは合っているでしょうか?ご確認ください。 ちなみにいつからかbootstrapが適用されなくなっていました。 しかし、ある程度機能を実装してからフロントを修正すれば良いと思い無視していました。 何かの参考になればと思います。
Harluz

2020/11/29 13:41

500番のエラーは消えbootstrapも適用されているように見えます。しかし、networkタブにてpendingとなり何かの処理が遅いもしくは実行されていないようです。 consoleの状況も追記しております。 修正の仕方が悪いのかもしれません。 何か他に必要なデータがございましたら、添付いたします。
maisumakun

2020/11/29 13:44

えっと、ブレークポイントを外して待ったらどれくらいでロードされますか?
maisumakun

2020/11/29 13:47

(ブレークポイントを仕掛けたこと自体を予想していませんでしたし、Harluzさんが何をどう変更したかも書かれていないので、事態がどう進展しているのか正確につかめていない感じです)
Harluz

2020/11/29 14:12

devtoolsのエラー内容が変わらないことから、そのままポートフォリオ作成を続けておりました。その際に、binding.pryにて一部デバッグを試みていたところでした。 consoleを確認した際に、ブレークポイントとあったため、それを外した上で再度実行した結果を掲載させていただきました。変わらずブレークポイントとなっていたため私の検討違いと思い質問を続けさせていただきました。 一度、内容を整理した上で、再度質問をアップしたいと思います。 知識の疎い私に親切に教えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問