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

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

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

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails 6

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

Q&A

解決済

1回答

936閲覧

[Rails]deviseのeditページからユーザー情報を更新すると、"PATCH / PUT"ではなく"DELETE"リクエストが送られる

hajsu00

総合スコア151

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails 6

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

0グッド

0クリップ

投稿2022/04/16 13:37

Railsにdiviseを用いてユーザー認証機能を実装完了し、ログイン後のユーザー情報編集機能実装中に発生したエラーを解決できずにいます。

ご助言いただけると幸いです。

起きている問題

divise備え付けのeditページからsubmitすると、"PATCH / PUT"ではなく"DELETE"リクエストが送られてしまう。

console

1Started DELETE "/users" for ::1 at 2022-04-16 21:06:42 +0900 2Processing by Users::RegistrationsController#destroy as HTML 3 Parameters: {"authenticity_token"=>"[FILTERED]", "user"=>{"email"=>"example@railstutorial.org", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "current_password"=>"[FILTERED]"}, "commit"=>"更新する"} 4 User Load (18.9ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 5 TRANSACTION (22.8ms) BEGIN 6 License Load (15.2ms) SELECT `licenses`.* FROM `licenses` WHERE `licenses`.`user_id` = 1 7 ReccurentHistory Load (27.3ms) SELECT `reccurent_histories`.* FROM `reccurent_histories` WHERE `reccurent_histories`.`license_id` = 1 8 ReccurentHistory Destroy (27.9ms) DELETE FROM `reccurent_histories` WHERE `reccurent_histories`.`id` = 1 9...

前提事項

・macOS Monterey v12.1
・ruby v3.0.3
・Rails v6.1.4.4
・devise 4.8.1

関係するコード

ルーティング

config/routes.rb

1Rails.application.routes.draw do 2 devise_for :users, controllers: { 3 registrations: 'users/registrations', 4 sessions: 'users/sessions', 5 passwords: 'users/passwords', 6 confirmations: 'users/confirmations' 7 } 8 9 devise_scope :user do 10 root "users/sessions#new" 11 end 12 13... 14 15 resources :users do 16 member do 17 get :following, :followers 18 end 19 resources :glider_flights 20 resources :licenses, only: [:new, :create, :index, :show, :edit, :update] 21 resources :licenses do 22 resources :reccurent_histories, only: [:new, :create, :index, :show, :edit, :update] 23 end 24 end 25 26 resources :users, only: [:show] 27... 28end

console

1 new_user_session GET /users/sign_in(.:format) users/sessions#new 2 user_session POST /users/sign_in(.:format) users/sessions#create 3 destroy_user_session DELETE /users/sign_out(.:format) users/sessions#destroy 4 new_user_password GET /users/password/new(.:format) users/passwords#new 5 edit_user_password GET /users/password/edit(.:format) users/passwords#edit 6 user_password PATCH /users/password(.:format) users/passwords#update 7 PUT /users/password(.:format) users/passwords#update 8 POST /users/password(.:format) users/passwords#create 9 cancel_user_registration GET /users/cancel(.:format) users/registrations#cancel 10 new_user_registration GET /users/sign_up(.:format) users/registrations#new 11 edit_user_registration GET /users/edit(.:format) users/registrations#edit 12 user_registration PATCH /users(.:format) users/registrations#update 13 PUT /users(.:format) users/registrations#update 14 DELETE /users(.:format) users/registrations#destroy 15 POST /users(.:format) users/registrations#create 16 new_user_confirmation GET /users/confirmation/new(.:format) users/confirmations#new 17 user_confirmation GET /users/confirmation(.:format) users/confirmations#show 18 POST /users/confirmation(.:format) users/confirmations#create 19 root GET / users/sessions#new

コントローラー

(変更箇所のみ記載)

app/controllers/users/registrations_controller.rb

1class Users::RegistrationsController < Devise::RegistrationsController 2 before_action :configure_sign_up_params, only: [:create] 3 before_action :set_sideber_data, only: [:edit] 4...

ビュー

app/views/users/registrations/edit.html.erb

1<% provide(:title, 'ユーザー情報編集') %> 2<% provide(:button_text, '更新する') %> 3 4<div class="mx-auto px-4"> 5 <div class="flex flex-row px-4"> 6 <%= link_to :back do %> 7 <i class="fa-solid fa-angle-left fa-2x pr-4"></i> 8 <% end %> 9 <div class="flex flex-col"> 10 <div class="text-2xl font-bold pr-4"><%= @user.name %></div> 11 </div> 12 </div> 13 14 <div class="bg-white py-6 sm:py-8 lg:py-12"> 15 <div class="max-w-screen-2xl px-4 md:px-8 mx-auto"> 16 <h2 class="text-gray-800 text-2xl lg:text-3xl font-bold text-center mb-4 md:mb-8">ユーザー情報編集</h2> 17 <%= form_for(resource, as: resource_name, url: user_registration_path, html: { method: :put }) do |f| %> 18 <%= render "devise/shared/error_messages", resource: resource %> 19 <div class="max-w-lg border rounded-lg mx-auto"> 20 <div class="flex flex-col gap-4 p-4 md:p-8"> 21 <div class="field"> 22 <%= f.label :email, "メールアドレス", class: 'inline-block text-gray-800 text-sm sm:text-base mb-2' %><br /> 23 <%= f.email_field :email, autofocus: true, autocomplete: "email", class: 'w-full bg-gray-50 text-gray-800 border focus:ring ring-indigo-300 rounded outline-none transition duration-100 px-3 py-2' %> 24 </div> 25 26                          ...(略) 27 28 <div class="actions"> 29 <%= f.submit yield(:button_text), class: "block bg-gray-800 hover:bg-gray-700 active:bg-gray-600 focus-visible:ring ring-gray-300 text-white text-sm md:text-base font-semibold text-center rounded-lg outline-none transition duration-100 px-8 py-3" %> 30 </div> 31 32 <h3>Cancel my account</h3> 33 <p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete %></p> 34 </div> 35 </div> 36 <% end %> 37 </div> 38 </div> 39</div>

試したこと

ビューのタグが間違っていないか確認

以前同じような問題に当たったことがあり、その時はビューに<form>タグが記載されていたことが不具合の原因でした。

https://teratail.com/questions/phkmw7ce1kc1eu

タグを確認しましたが、間違ってはいなさそうです。

コンソールでupdateしてみる

コンソールでの更新は成功しています。
リクエストの問題なのであまり関係ないと思いますが...

[4] pry(main)> user.update!(id: 1, name: "Example User", admin: true, email: "example@railstutorial.or", introduction: "ここはユーザーのプロフィール文です。入力可能な文字数は160字にする予定です。\n ...", location: "東京", created_at: "2022-04-14 20:22:37.134415000 +0900", updated_at: "2022-04-14 TRANSACTION (0.3ms) BEGIN User Exists? (4.3ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'example@railstutorial.or' AND `users`.`id` != 1 LIMIT 1 User Update (3.6ms) UPDATE `users` SET `users`.`introduction` = 'ここはユーザーのプロフィール文です。入力可能な文字数は160字にする予定です。\n ...', `users`.`confirmation_token` = 'a_KR8WrLxRQYiFT7xdSn', `users`.`confirmation_sent_at` = '2022-04-16 13:17:21', `users`.`unconfirmed_email` = 'example@railstutorial.or', `users`.`updated_at` = '2022-04-16 13:17:21.139611' WHERE `users`.`id` = 1 TRANSACTION (2.4ms) COMMIT Rendering users/mailer/confirmation_instructions.html.erb Rendered users/mailer/confirmation_instructions.html.erb (Duration: 4.9ms | Allocations: 1022)

form_withで書き直す

devise標準のform_forではなく、form_withで書き直してみましたが、同じくDELETEリクエストになっていました(ログが長すぎて取得に失敗)。

app/views/users/registrations/edit.html.erb

1<%= form_for(resource, as: resource_name, url: user_registration_path, html: { method: :put }) do |f| %> 23<%= form_with model: @user, url: user_registration_path, local: true do |f| %>

なぜ、edit.html.erbからsubmitするとDELETEリクエストが送信されてしまうのでしょうか。Users::RegistrationsController#destroyが実行されてしまうのでしょうか。

お手数お掛けしますが、よろしくお願いします。

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

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

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

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

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

guest

回答1

0

自己解決

原因

フォームの中にdeleteボタンを設置していたのが原因。
以下の通り削除したら正常に動作しました。

app/views/users/registrations/edit.html.erb

1... 2<%= form_for(resource, as: resource_name, url: user_registration_path, html: { method: :put }) do |f| %> 3... 4# --------------------------------- 削除 --------------------------------- 5 <h3>Cancel my account</h3> 6 <p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete %></p> 7# --------------------------------- 削除 --------------------------------- 8... 9<% end %> 10...

投稿2022/04/17 11:56

hajsu00

総合スコア151

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問