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

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

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

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

Ruby on Rails 6

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

解決済

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

hajsu00
hajsu00

総合スコア117

Devise

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

Ruby on Rails 6

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

1回答

0評価

0クリップ

166閲覧

投稿2022/04/16 13:37

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

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

起きている問題

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

console

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

前提事項

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

関係するコード

ルーティング

config/routes.rb

Rails.application.routes.draw do devise_for :users, controllers: { registrations: 'users/registrations', sessions: 'users/sessions', passwords: 'users/passwords', confirmations: 'users/confirmations' } devise_scope :user do root "users/sessions#new" end ... resources :users do member do get :following, :followers end resources :glider_flights resources :licenses, only: [:new, :create, :index, :show, :edit, :update] resources :licenses do resources :reccurent_histories, only: [:new, :create, :index, :show, :edit, :update] end end resources :users, only: [:show] ... end

console

new_user_session GET /users/sign_in(.:format) users/sessions#new user_session POST /users/sign_in(.:format) users/sessions#create destroy_user_session DELETE /users/sign_out(.:format) users/sessions#destroy new_user_password GET /users/password/new(.:format) users/passwords#new edit_user_password GET /users/password/edit(.:format) users/passwords#edit user_password PATCH /users/password(.:format) users/passwords#update PUT /users/password(.:format) users/passwords#update POST /users/password(.:format) users/passwords#create cancel_user_registration GET /users/cancel(.:format) users/registrations#cancel new_user_registration GET /users/sign_up(.:format) users/registrations#new edit_user_registration GET /users/edit(.:format) users/registrations#edit user_registration PATCH /users(.:format) users/registrations#update PUT /users(.:format) users/registrations#update DELETE /users(.:format) users/registrations#destroy POST /users(.:format) users/registrations#create new_user_confirmation GET /users/confirmation/new(.:format) users/confirmations#new user_confirmation GET /users/confirmation(.:format) users/confirmations#show POST /users/confirmation(.:format) users/confirmations#create root GET / users/sessions#new

コントローラー

(変更箇所のみ記載)

app/controllers/users/registrations_controller.rb

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

ビュー

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

<% provide(:title, 'ユーザー情報編集') %> <% provide(:button_text, '更新する') %> <div class="mx-auto px-4"> <div class="flex flex-row px-4"> <%= link_to :back do %> <i class="fa-solid fa-angle-left fa-2x pr-4"></i> <% end %> <div class="flex flex-col"> <div class="text-2xl font-bold pr-4"><%= @user.name %></div> </div> </div> <div class="bg-white py-6 sm:py-8 lg:py-12"> <div class="max-w-screen-2xl px-4 md:px-8 mx-auto"> <h2 class="text-gray-800 text-2xl lg:text-3xl font-bold text-center mb-4 md:mb-8">ユーザー情報編集</h2> <%= form_for(resource, as: resource_name, url: user_registration_path, html: { method: :put }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="max-w-lg border rounded-lg mx-auto"> <div class="flex flex-col gap-4 p-4 md:p-8"> <div class="field"> <%= f.label :email, "メールアドレス", class: 'inline-block text-gray-800 text-sm sm:text-base mb-2' %><br /> <%= 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' %> </div>                           ...(略) <div class="actions"> <%= 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" %> </div> <h3>Cancel my account</h3> <p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete %></p> </div> </div> <% end %> </div> </div> </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

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

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

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Devise

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

Ruby on Rails 6

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