閲覧ありがとうございます。
現在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では一切エラー表示は出ません。
ーーーーーーーー
説明不足等ありましたら、言って頂ければ幸いです。ご教示何卒よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/28 06:51
2019/09/28 06:57