前提・実現したいこと
Railsのアプリケーションで、Deviseを使ってユーザー登録機能やログイン認証、ユーザー登録情報の更新などをできるようにしました。
また、パスワードなしで自分のユーザー情報を編集できるところまでは実装できました。
さらに、管理者ユーザーを設定し、current_userではない他のユーザーの登録情報の内容を
編集できる機能を実装したいと思っていますが、
まずは誰でも他のユーザーの情報を変更できるようにする部分を実装したいです。
updateアクションでresourceのUser idにcurrent_userのidが挿入されてしまい、
アップデートできない状態になっています。
ご教授よろしくお願いいたします。
発生している問題・エラーメッセージ
ActiveRecord::RecordNotFound at /users Couldn't find UsersDepartment with ID=1 for User with ID=25
ログインしているcurrent_userのidが入ってしまうため、UsersDepartmentのIDが1に当てはまるものはないというエラーが出てしまいます。
該当のソースコード
registration_controller.rb
ruby
1# frozen_string_literal: true 2 3class Users::RegistrationsController < Devise::RegistrationsController 4 before_action :configure_sign_up_params, only: [:create] 5 before_action :configure_account_update_params, only: [:update] 6 prepend_before_action :require_no_authentication, only: [:cancel] 7 prepend_before_action :authenticate_scope!, only: [:new, :create ,:edit, :update, :destroy] 8 before_action :creatable?, only: [:new, :create] 9 before_action :editable?, only: [:edit, :update] 10 11 # GET /resource/sign_up 12 def new 13 super 14 end 15 16 # POST /resource 17 def create 18 super 19 @user = User.new(configure_permitted_parameters) 20 @user.save 21 end 22 23 # GET /resource/edit 24 def edit 25 #super 26 self.resource = resource_class.to_adapter.get!(params[:id]) 27 end 28 29 # PUT /resource 30 def update 31 super 32 # self.resource = resource_class.to_adapter.get!(params[:id]) 33 34 end 35 36 # DELETE /resource 37 def destroy 38 super 39 end 40 41 # GET /resource/cancel 42 # Forces the session data which is usually expired after sign 43 # in to be expired now. This is useful if the user wants to 44 # cancel oauth signing in/up in the middle of the process, 45 # removing all OAuth session data. 46 def cancel 47 super 48 end 49 50 protected 51 52 #パスワードなしで編集できるようにする 53 def update_resource(resource, params) 54 resource.update_without_password(params) 55 end 56 57 # If you have extra params to permit, append them to the sanitizer. 58 def configure_account_update_params 59 devise_parameter_sanitizer.permit(:account_update, keys: [:user_name, :full_name, users_departments_attributes: [:id,:department_id,:position_id,:team_id]]) 60 end 61 62 # The path used after sign up. 63 def after_sign_up_path_for(resource) 64 super(resource) 65 end 66 67 # The path used after sign up for inactive accounts. 68 def after_inactive_sign_up_path_for(resource) 69 super(resource) 70 end 71 72end 73
試したこと
updateの中でも
ruby
1self.resource = resource_class.to_adapter.get!(params[:id])
というようにresourceにparams[:id]を呼び出すと、IDがないと怒られます。
https://qiita.com/h-sakano/items/7a572dd9691cc2a7d63c
このあたりを参照していますがうまくできません。
補足情報(FW/ツールのバージョンなど)
rails 5.2.4
ruby 2.6.6
mysql2 0.4.4'
devise 4.7.3
あなたの回答
tips
プレビュー