いつもお世話になっております。ユーザー新規登録についてgem deviseを利用しております。
バリデーションメッセージの表示で、自前のフォームビルダーを使用します。そのため、デフォルトで定義されているdeviseのバリデーションメッセージを表示するヘルパーメソッドが不要になったのですが、これを無効にする方法が分かりません。
アドバイス頂けたら幸いです。よろしくお願いします。
(deviseのヘルパーメソッドを無効にすれば良いという考えですが、違う点で問題がございましたら教えてください。)
なお、以下の方法がベストプラクティスであれば良いのですが、上記の問題を解決する手段として以下2つは考えておりますので、それ以外の方法を希望します。
- devise/shared/_error_messages.html.hamlを削除する
- 発生する不要なHTMLをCSSでhidden等使用して非表示にする
解決したいこと
バリデーションメッセージの表示でgem devise既存のバリデーションメッセージを消したい。バリデーションメッセージはフォームビルダーを定義し、そちらを利用する。
- 消したいメッセージの画像
https://gyazo.com/83c0db7c8ef40befd32c9d5f821df55f
環境など
- Rails 6.0.3.1
- ruby 2.7.1
- gem devise
- ユーザー登録はウィザード形式を実装中
関連コード
- devise/registration/new.html.haml
%h2 ユーザー情報登録 = form_for(@user, url: user_registration_path) do |f| -# = render "devise/shared/error_messages", resource: @user .field = f.label :nickname %br/ = f.text_field :nickname .field = f.label :email %br/ = f.email_field :email, autofocus: true, autocomplete: "email" .field = f.label :password - if @minimum_password_length %em (#{@minimum_password_length} characters minimum) %br/ = f.password_field :password, autocomplete: "new-password" .field = f.label :password_confirmation %br/ = f.password_field :password_confirmation, autocomplete: "new-password" .actions = f.submit "Next" = render "devise/shared/links"
- devise/registration/new_profile.html.haml
= render "shared/header" = render "shared/nav" .profile-reg-wrapper .profile-reg %h2.profile-reg__title プロフィールの登録 .profile-main .profile-main__form = form_for @profile, builder: WithErrorFormBuilder do |f| = render "devise/shared/error_messages", resource: @profile .field--1 = f.label "電話番号(半角入力)", class: 'label-reg-profile--1' %br/ = f.text_field :phonenumber, autofocus: true, autocomplete: "phonenumber", placeholder: "半角入力", class: "text-space" .field = f.label "年齢(半角入力)", class: 'label-reg-profile' %br/ = f.text_field :old, autofocus: true, autocomplete: "old", placeholder: "半角入力", class: "text-space" .field = f.label "職業", class: 'label-reg-profile' %br/ = f.collection_select :job ,Job.all, :id, :name, prompt: "--" .field = f.label "経験年数", class: 'label-reg-profile' %br/ = f.text_field :experience, autofocus: true, autocomplete: "experience", placeholder: "半角入力", class: "text-space" 年 .field = f.label "練習頻度", class: 'label-reg-profile' %br/ = f.collection_select :practice_time ,PracticeTime.all, :id, :name, prompt: "--", class: "selectbox-space" .field = f.label "詳細", class: 'label-reg-profile' %br/ = f.text_area :detail, autofocus: true, autocomplete: "detail", placeholder: "入力してください", class: "text-space--detail" .field = f.label "クラブ名", class: 'label-reg-profile' %br/ = f.text_field :club, autofocus: true, autocomplete: "club", placeholder: "入力してください", class: "text-space" .field = f.label "プロフィール画像", class: 'label-reg-profile' %br/ = f.file_field :avatar , class: "image-input-space" .actions-reg = f.submit "登録する", class: 'actions-reg__btn' -# = render "devise/shared/links" = render "shared/footer"
- devise/shared/_error_messages.html.haml
- if resource.errors.any? #error_explanation %h2 = I18n.t("errors.messages.not_saved", | count: resource.errors.count, | resource: resource.class.model_name.human.downcase) | %ul - resource.errors.full_messages.each do |message| %li= message
- with_error_form_builder.rb
class WithErrorFormBuilder < ActionView::Helpers::FormBuilder # エラーメッセージオブジェクトが格納されていたらエラーエッセージを表示するli要素を含んだ、ulを作成する def pick_errors(attribute) return nil if @object.nil? || (messages = @object.errors.messages[attribute]).nil? lis = messages.collect do |message| %(<li class="error-message">#{@object.errors.full_message(attribute, message)}</li>) end.join %(<ul class="error">#{lis}</ul>).html_safe end # 既存のフォールビルダーに対し、エラーメッセージの有無により、通常通りのヘルパーメソッドが、pick_errorsの呼び出しを加えたメソッドにする def text_field(attribute, options = {}) return super if options[:no_errors] super + pick_errors(attribute) end def email_field(attribute, options = {}) return super if options[:no_errors] super + pick_errors(attribute) end def password_field(attribute, options = {}) return super if options[:no_errors] super + pick_errors(attribute) end def telephone_field(attribute, options = {}) return super if options[:no_errors] super + pick_errors(attribute) end def date_select(attribute, options = {}) return super if options[:no_errors] super + pick_errors(attribute) end def collection_select(attribute, select, key, value, options = {}, include = {}) return super if options[:no_errors] super + pick_errors(attribute) end def fields_for(attribute, options = {}) return super if options[:no_errors] super + pick_errors(attribute) end def number_field(attribute, options = {}) return super if options[:no_errors] super + pick_errors(attribute) end def text_area(attribute, options = {}) return super if options[:no_errors] super + pick_errors(attribute) end end
- profile.rb
class Profile < ApplicationRecord belongs_to :user, optional: true validates :old, :job, :experience, :phonenumber, :practice_time, presence: true mount_uploader :avatar, AvatarUploader end
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/13 14:15
2020/08/13 22:58