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

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

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

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

HTML

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

3回答

1813閲覧

Railsのlink_toでPOSTできない

HINOKINO001104

総合スコア5

Ruby

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

HTML

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2023/05/03 11:24

発生している問題

link_toでmethod: :postと指定しているのにGETしてしまいます。

前提

Ruby on rails 7でSNSを作っています。
ログアウト機能を実装中に以下のエラーが発生しました。

発生している問題・エラーメッセージ

Routing Error No route matches [GET] "/logout"

該当のソースコード

erb

1<div class="header-link"> 2 <%= link_to("ログアウト", "/logout", class: "header-link-text", method: :post)%> 3</div>

試したこと

開発者ツールで調べました。
HTMLはこのようになっていました。

html

1<a class="header-link-text" rel="nofollow" data-method="post" href="/logout">ログアウト</a>

このdata-methodというのが調べてもあまりよくわかりませんでした。
どうしてPOSTできないのでしょう。
詳しい方、ぜひご指導お願いします。

補足情報

Windows 10
Ruby 3.1.3
Ruby on Rails 7.0.4.3

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

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

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

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

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

m.ts10806

2023/05/03 11:31

>data-methodというのが調べてもあまりよくわかりませんでした。 ここだけに応えると「data属性」です。ハイフン以降は任意の文字列を指定できます。 MDN参照
HINOKINO001104

2023/05/03 11:37 編集

m.ts10806さんへ そういうことなんですね。 勉強になりました。
hoshi-takanori

2023/05/03 18:23

HTML の仕様上、a タグでは POST できないはず。やるとしたら、隠し form を作っておいて、a タグでそれを submit するとか…。
guest

回答3

2

Ruby On Rails 7の場合ですと、link_toで

ERB

1<%= link_to("テキスト", "転送先URL", method: :post) %>

とし、POSTとしてHTTPリクエストを送ることができます。
しかし、GETとしてアクセスしてしまう、ということでしょうか。
以下、もしかしたらできるかもしれない、という解決策を考えてみます。

  • button_toに変えてみる

デザインが変わってしまいますが、これで動いた事例があります。

ERB

1<%= button_to("ログアウト", "/logout", class: "header-link-text", method: :post)%>
  • あえて<a>で書いてみる

link_toで書かずに、直に<a></a>で書いてみてはどうでしょうか。data-method="post"を
読み込んでからでお願いします

HTML

1<a class="header-link-text" rel="nofollow" data-method="post" href="/logout">ログアウト</a>
  • config/routes.rb を確認

もしかすると、以下のようになっているかもしれません。
config/routes.rb

Ruby

1Rails.application.routes.draw do 2 ... 3 get '/logout' 4 # または 5 get '/logout' => 'コントローラ名#def名' 6 ... 7end

この場合、getをpostに直さなければなりません。しかし、これはエラー上可能性は
低いと思われます。

Ruby

1Rails.application.routes.draw do 2 ... 3 # get を post に変更 4 post '/logout' 5 # または 6 post '/logout' => 'コントローラ名#def名' 7 ... 8end

data-method とは
※これはとある記事を読んで、記述しております。正確性に関しては保証できません。
誠に申し訳ございません。
そもそも、HTMLには、data-(好きな名前)のように、「カスタムデータ属性」が存在しています。
例です。

HTML

1<開始タグ data-好きな名前="値"></終了タグ> 2<div data-teratail="teratail"></div> 3<div data-rubyonrails="thisisrubyonrails"></div>

これに対して、cssを以下のように記述できたりします。

CSS

1div[data-ruby] { 2 color: #AAA; 3} 4[data-rubyonrails] { 5 background-color: #464c56; 6}

そして、これは推測なのですが、おそらくRailsが、アンカー(aタグ)が
クリックされたとき、data-methodという、カスタムデータ属性
(data-method)を読み取って、それでHTTPリクエストを
分けているのだと考えられます。
※あくまでも推測です。正確性は保証できません。
そのような感じです。手助けが出来れば嬉しいです。

投稿2023/10/08 11:55

michikusa-mc

総合スコア29

HINOKINO001104👍を押しています
HINOKINO001104❤️を押しています

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

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

HINOKINO001104

2024/04/27 06:09

ごめんなさい。あまりいい回答がなく、とりあえずBAにして閉じて1年見てませんでした。 ありがとうございます!!また使う機会があったら試してみます。
guest

1

自己解決

1年半ほど立ちましたが、ようやく解決法がわかりました!
https://qiita.com/null_candy/items/9a6a3c4d49f52dcdd014
改めて調べてみたら出てきました。回答してくださった方ありがとうございました。

投稿2024/08/25 14:25

HINOKINO001104

総合スコア5

michikusa-mc👍を押しています

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

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

1

他の方のコメントにもありますが、HTML標準ではリンクでPOSTを行うことができないため、JavaScriptを使ってそれを実現しています。

ただ、Rails 7ではTurboという新しい仕組みが導入されたのに対して、data-methodはRails 6以前のrails-ujsを使った書き方となっています。

どちらかのやり方に統一する必要があります。

投稿2023/05/03 23:38

maisumakun

総合スコア146628

m.ts10806👍を押しています

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

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

HINOKINO001104

2023/05/04 05:10

では、どうすればPOSTされるようになるのですか?
maisumakun

2023/05/04 05:35

まずは、ujsで進めるかTurboで進めるかを決めてください。そして、それぞれの手法について調べましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問