🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Devise

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

Ruby

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

Ruby on Rails

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

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Q&A

解決済

2回答

3045閲覧

deviseで作成したユーザー情報編集機能で"name"がupdateできない。Unpermitted parameter: :nameエラー。

kousuke24

総合スコア29

Devise

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

Ruby

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

Ruby on Rails

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

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

0グッド

0クリップ

投稿2019/09/27 14:45

編集2019/09/27 23:34

閲覧ありがとうございます。
現在Ruby on Railsで猫の画像を投稿するアプリを作成しています。gem 'devise'を使用し、ユーザー登録機能を作成しました。その後「name」カラムを追加し、ユーザー登録情報(name,email,password)を編集する機能を追加しました。
ユーザーのnameを変更しようとするとUnpermitted parameter: :nameのエラーが発生してしまいます。ちなみにemail,passwordは正常に編集することができます。

エラー内容

Started PATCH "/users" for ::1 at 2019-09-27 23:34:27 +0900 Processing by RegistrationsController#update as HTML Parameters: {"authenticity_token"=>"LviVSHwp6UyQ7DN8THhOVzrGL5Ku+IjZckmkm9YoVKGvNNG Bqz/92ii0FPVXjOfd0ZzLm21A98FrafoM3MAGIw==", "user"=>{"name"=>"づかにし1", "email"=>"e xample@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"変更する"} User Load (2.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY " users"."id" ASC LIMIT $2 [["id", 2], ["LIMIT", 1]] User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]] Unpermitted parameter: :name (0.2ms) BEGIN ↳ app/models/user.rb:41:in `update_without_current_password' User Exists? (10.9ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = $1 AND "users"."id" != $2 LIMIT $3 [["email", "example@gmail.com"], ["id", 2], ["LIMIT", 1] ] ↳ app/models/user.rb:41:in `update_without_current_password' User Update (10.3ms) UPDATE "users" SET "email" = $1, "updated_at" = $2 WHERE "use rs"."id" = $3 [["email", "example@gmail.com"], ["updated_at", "2019-09-27 14:34:27.8 39353"], ["id", 2]] ↳ app/models/user.rb:41:in `update_without_current_password' (6.3ms) COMMIT ↳ app/models/user.rb:41:in `update_without_current_password' Unpermitted parameter: :name Unpermitted parameter: :name Redirected to http://localhost:3000/users/2 Completed 302 Found in 64ms (ActiveRecord: 30.3ms | Allocations: 8681)

該当コード

user.rb

class User < ApplicationRecord mount_uploader :image, ImageUploader has_many :posts, dependent: :destroy has_many :likes # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :omniauthable def self.find_for_oauth(auth) user = User.where(uid: auth.uid, provider: auth.provider).first unless user user = User.create( uid: auth.uid, provider: auth.provider, email: User.dummy_email(auth), password: Devise.friendly_token[0, 20], image: auth.info.image, name: auth.info.name, nickname: auth.info.nickname, location: auth.info.location ) end user end validates :name, presence: true, length: { maximum: 30 } def update_without_current_password(params, *options) params.delete(:current_password) if params[:password].blank? && params[:password_confirmation].blank? params.delete(:password) params.delete(:password_confirmation) end result = update_attributes(params, *options) clean_up_passwords result end private def self.dummy_email(auth) "#{auth.uid}-#{auth.provider}@example.com" end end

users_controller.rb

class UsersController < ApplicationController def show @user = User.find_by(id: params[:id]) end def edit @user = User.find(params[:id]) end def update @user = User.find(params[:id]) if current_user == @user if @user.update(user_params) flash[:success] = 'プロフィール画像を変更しました' render :show else flash.now[:danger] = 'プロフィール画像の変更に失敗しました' render :show end else redirect_to user_path end end private def user_params params.require(:user).permit(:image) end end

apprication_controller.rb

class ApplicationController < ActionController::Base protect_from_forgery with: :exception before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) devise_parameter_sanitizer.permit(:account_update, keys: [:name]) end end

registrations_controller.rb

class RegistrationsController < Devise::RegistrationsController protected def update_resource(resource, params) resource.update_without_current_password(params) end def after_update_path_for(resource) user_path(resource) end end

registrations/edit.html.erb

<div class="container"> <h3 class="text-center text-secondary form-group">登録情報変更</h3> <div class="card-header"> <%= form_with scope: resource, as: resource_name, url: registration_path(resource_name), local: true, method: :patch do |f| %> <div class="ield form-group mt-3 text-center col-sm-6 offset-sm-3"> <%= f.label :name, "名前" %> <%= f.text_field :name, autofocus: true, class: "form-control" %> </div> <div class="ield form-group mt-3 text-center col-sm-6 offset-sm-3"> <%= f.label :email, "メールアドレス" %> <%= f.email_field :email, autofocus: true, class: "form-control" %> </div> <div class="ield form-group mt-3 text-center col-sm-6 offset-sm-3"> <%= f.label :password, "パスワード" %> <%= f.password_field :password, autofocus: "off", class: "form-control" %> </div> <div class="ield form-group mt-3 text-center col-sm-6 offset-sm-3"> <%= f.label :password_confirmation, "パスワード確認" %> <%= f.password_field :password_confirmation, autofocus: "off", class: "form-control" %> </div> <div class="actions form-group col-sm-6 offset-sm-3"> <%= f.submit "変更する", class: "btn btn-primary form-control" %> </div> <% end %> </div> </div>

ーーー補足ーーー
①パスワードを入力しなくても、ユーザー情報(name,email)を編集できるようにしています。
②ユーザーのnameを変更し、「変更する」ボタンを押すとlocalhost:3000では
イメージ説明
上記の画像のように、flashメッセージでは「アカウント情報を変更しました」と出ますが、name(名前)の表示は編集前と変わりません。
③Unpermitted parameter: :nameエラーは、ターミナルで出ておりlocalhost:3000では一切エラー表示は出ません。
ーーーーーーーー

説明不足等ありましたら、言って頂ければ幸いです。ご教示何卒よろしくお願いします。

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

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

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

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

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

guest

回答2

0

自己解決

application_controller.rbに記入していた

before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) devise_parameter_sanitizer.permit(:account_update, keys: [:name]) end

をregistrations_controller.rbに記入

class RegistrationsController < Devise::RegistrationsController before_action :configure_permitted_parameters protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) devise_parameter_sanitizer.permit(:account_update, keys: [:name]) end end

その際、before_action :configure_permitted_parametersの後ろに記入していた「if: :devise_controller?」は消す。deviseのコントローラーに直接書いているため必要ない。

ググっていると上記のコードはapplication_controller,rbに記入するのが一般的みたいだが、なぜか「Unpermitted parameter: :nameエラー」が出て名前の情報を変更できなかったため、仕方なくregistrations_controller.rbに記入した。

投稿2019/09/28 06:37

kousuke24

総合スコア29

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

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

siruku6

2019/09/28 06:51

解決したようで何よりです。
kousuke24

2019/09/28 06:57

なんとかなりました笑 わざわざお時間を割いて頂きありがとうございましたm(- _ -)m
guest

0

色々勘違いしてました。
参考にならないと思いますので、他の回答を参考にして下さい。。

自作コントローラーのparamsに許可するカラムを追加してみましょう。

この部分を

ruby

1def user_params 2 params.require(:user).permit(:image) 3end

次のようにしてみてはいかがでしょう?

ruby

1def user_params 2 params.require(:user).permit(:image, :name) 3end

投稿2019/09/27 23:23

編集2019/09/27 23:30
siruku6

総合スコア1382

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問