deviseにて新規登録では、
nickname,password,encryted_passwordを登録できるようにし
ユーザーの編集画面にて**自己紹介文(profile)**を保存できるように設定をしたい!
##行ったこと
deviseを用いたユーザーの編集には、パスワードと確認用のパスワードを更新しないとデータベースに保存ができないとteratailの別の質問で判明しました。
いつもありがとうございます!
今回の実装は、ただ自己紹介文を追加したいのでパスワードも確認用のパスワードも更新は、したくありません。
そのときの回答者様が参考に教えてくださった
Rails Deviseでユーザー編集をパスワードを入力しないで更新する方法
こちらの記事を参考に記述を行いました!
##実際のエラー文
普通に行うと当然のように保存はできなかったので
ruby
1regstrations_controller.rb 2 324: def update 4 25: super 5 => 30: binding.pry 6 31: end
registrations_controller.rbにbinding.pryでエラー文を確認
[1] pry(#<Users::RegistrationsController>)> @user.update ArgumentError: wrong number of arguments (given 0, expected 1) from /Users/eleaco/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.4/lib/active_record/persistence.rb:616:in `update' [2] pry(#<Users::RegistrationsController>)> @user.errors.messages => {:password=>["is invalid"], :profile=>[]} ←ここに問題があるようです… [3] pry(#<Users::RegistrationsController>)> exit Completed 200 OK in 11473ms (Views: 67.7ms | ActiveRecord: 2.0ms | Allocations: 48570)
before 最初はこのようになっていました {:password=>["can't be blank", "is invalid"], :current_password=>["can't be blank"], :profile=>[]} after 参考を基に記述を追加しこのようになりました. {:password=>["is invalid"], :profile=>[]} あとpasswordのis invalid を消せればいいはず…
##コード
コントローラーからみていきます
ruby
1registrations_controller.rb 2 3class Users::RegistrationsController < Devise::RegistrationsController 4 before_action :configure_account_update_params, only: [:update] 5 6 # GET /resource/edit 7 def edit 8 @page_name = "プロフィール編集画面" 9 super 10 end 11 12 # PUT /resource 13 def update 14 super 15 binding.pry 16 end 17 18 protected 19 20 ↓追加した記述 21 def update_resource(resource, params) 22 resource.update_without_password(params) 23 end 24 ここまで 25 26 def configure_account_update_params 27 devise_parameter_sanitizer.permit(:account_update, keys: [:profile]) 28 end 29end
application_controller.rb class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname]) end end
モデルをみていきます
class User < ApplicationRecord has_many :photos has_many :comments has_many :favorites has_many :favorite_photos, through: :favorites, source: :photo has_one_attached :avatar with_options presence: true do |i| i.validates :nickname i.validates :email i.validates :encrypted_password end ↓ここでcreateのみにバリデーションをかけたつもりでしたがダメでした validates :password, presence: true, on: :create devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable ↓ここから追加で記述したもの 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 ここまで
viewをみていきます
<%= render "shared/edit_header"%> <%= javascript_pack_tag 'registrations/preview' %> <%= form_with model: @user, url: user_registration_path, local: true do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="edit-profile-container"> <%= f.text_area :profile, class: 'edit-profile'%> </div> <div class='post-new-btn'> <%= f.submit "変更する" ,class: 'post-new'%> </div> </div> <% end %>
このような感じです…
どうか皆様のお力をお貸しください!!よろしくお願いいたします!!