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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Devise

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

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

1回答

3301閲覧

devise ユーザー編集時のパスワードのバリデーション!!のお悩み

EleAco

総合スコア15

Devise

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

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/11/03 13:07

編集2020/11/04 02:54

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 %>

このような感じです…
どうか皆様のお力をお貸しください!!よろしくお願いいたします!!

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

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

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

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

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

winterboum

2020/11/03 13:20

"can't be blank" は消えているので validates :password, presence: true, on: :create は効いています。 "is invalid" は形式チェックにかかっている(空だから当然)そのcheckがどこで行われているのか、ですが。はて。。。
EleAco

2020/11/03 13:36

winterboumさん ご回答ありがとうございます! devise :database_authenticatable, :registerable, :recoverable, :rememberable 消しましたが… エラー文は変わらす is invalidです…(;_;)
winterboum

2020/11/03 13:41

サーバー再起動してみてください
EleAco

2020/11/03 13:48

winterboumさん ダメでした… サーバーの再起動、データベースのリセットを行いましたが同じエラー文が吐き出されます… gitのコードを共有するってのはダメなんですかね?
winterboum

2020/11/03 22:39

gitのコードを共有する のは当たり前にすることですが、、、、
EleAco

2020/11/04 01:52

winterboumさん すみません、ご回答いただいているのに生意気なことを言いまして… 共有させてください!! https://github.com/EleAco/photo_roke こちらになりますどうぞよろしくお願いいたします!
sakura_hana

2020/11/04 02:23

タグ「teratail」は関係無いので外してください。
EleAco

2020/11/04 02:54

sakura_hanaさん かしこまりました!
guest

回答1

0

:validatable を消してください。
その代わり、必要なvalidationをUserに記述する必要があります。

投稿2020/11/03 13:23

winterboum

総合スコア23567

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問