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

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

ただいまの
回答率

87.58%

[Rails] Deviseで他のユーザーの登録情報を編集できない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 450

score 2

前提・実現したいこと

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

# frozen_string_literal: true

class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]
  before_action :configure_account_update_params, only: [:update]
  prepend_before_action :require_no_authentication, only: [:cancel]
  prepend_before_action :authenticate_scope!, only: [:new, :create ,:edit, :update, :destroy]
  before_action :creatable?, only: [:new, :create]
  before_action :editable?, only: [:edit, :update]

  # GET /resource/sign_up
  def new
    super
  end

  # POST /resource
  def create
    super
    @user = User.new(configure_permitted_parameters)
    @user.save
  end

  # GET /resource/edit
  def edit
    #super
    self.resource = resource_class.to_adapter.get!(params[:id])
  end

  # PUT /resource
  def update
    super
    # self.resource = resource_class.to_adapter.get!(params[:id])

  end

  # DELETE /resource
  def destroy
    super
  end

  # GET /resource/cancel
  # Forces the session data which is usually expired after sign
  # in to be expired now. This is useful if the user wants to
  # cancel oauth signing in/up in the middle of the process,
  # removing all OAuth session data.
  def cancel
    super
  end

  protected

  #パスワードなしで編集できるようにする
  def update_resource(resource, params)
    resource.update_without_password(params)
  end

  # If you have extra params to permit, append them to the sanitizer.
  def configure_account_update_params
    devise_parameter_sanitizer.permit(:account_update, keys: [:user_name, :full_name, users_departments_attributes: [:id,:department_id,:position_id,:team_id]])
  end

  # The path used after sign up.
  def after_sign_up_path_for(resource)
    super(resource)
  end

  # The path used after sign up for inactive accounts.
  def after_inactive_sign_up_path_for(resource)
    super(resource)
  end

end

試したこと

updateの中でも

self.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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • winterboum

    2021/01/19 07:59

    まだ必要ですか?
    でしたら、以下の3つを載せてください
    1.update を呼ぶview
    2. 1を書き出す controller
    3. update を呼んだ時のパラメーター(logからコピペが良いです)

    キャンセル

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

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

  • ただいまの回答率 87.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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