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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

1回答

1428閲覧

Railsで独自設定したFormhelperモジュールが読み込まれません。

Kiyobun510

総合スコア12

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/06/27 11:35

編集2020/06/27 11:37

ユーザー登録画面で、バリデーションエラーになったとき、画像のようにエラーメッセージをinputタグの下に表示させるためにフォーム作成時のビューヘルパーの引数に builder: FormHelper::FormWithErrorMessageBuilder を設定したのですが読み込まれません。
(/helpersディレクトリ配下に、form_helper.rというファイルをつくり、ActionView::Helpers::FormBuilderクラスを継承したモジュールを作成しました。このファイルはGUIで直接作成したのですがこれがいけなかった...?)

エラー文は以下の通りです。

error

1uninitialized constant ActionView::Helpers::FormHelper::FormWithErrorMessageBuilder

エラー画面
エラー画面

イメージ画像
イメージ画像

new.html.erb

ruby

1<%= form_with(model: @user, builder: FormHelper::FormWithErrorMessageBuilder, local: true) do |f| %> 2 <div class="uk-margin"> 3 <%= f.label :ニックネーム, class: "uk-form-label" %> 4 <div class="uk-form-controls"> 5 <%= f.text_field :nickname, class: "uk-input" %> 6 </div> 7 </div> 8                 (中略) 9 <% end %>

/helpers/form_helper

ruby

1module FormHelper 2 class FormWithErrorMessageBuilder < ActionView::Helpers::FormBuilder 3 def input_field_with_error(attribute, options={}, &block) 4 # 入力フォームと同じ属性のエラーメッセージを取得する 5 error_messages = @object.errors.full_messages_for(attribute) 6 7 # エラーがある場合のみ、エラー用のHTMLにする 8 if error_messages.any? 9 options[:class] << "input-with-error" 10 error_contents = create_error_div(attribute, error_messages) 11 end 12 13 # 従来の入力フォーム と 生成されたエラーメッセージ を連結して返す 14 block.call + error_contents || "" 15 end 16 17 # エラーメッセージのHTMLタグを作成する 18 def create_error_div(attribute, messages) 19 # content_tag でHTMLタグを生成 20 @template.content_tag(:div, class: "input-with-error") do 21 messages.each do |message| 22 @template.concat(@template.content_tag(:div, message)) 23 end 24 end 25 end 26 27 # 既存のビューヘルパーメソッドをオーバーライドする 28 def text_field(attribute, options={}) 29 input_field_with_error(attribute, options) do 30 super 31 end 32 end 33 def email_field(attribute, options={}) 34 input_field_with_error(attribute, options) do 35 super 36 end 37 end 38 def password_field(attribute, options={}) 39 input_field_with_error(attribute, options) do 40 super 41 end 42 end 43 end 44end

##試したこと
:builer => FormHelper::FormWithErrorMessageBuilderにしたり()を消してみたり書き方を色々変えてみましたがダメでした。

情報が少なく色々と調べましたが解答が得られませんでした。
ご教授いただければ幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

FormBuilder を触ったことがないので、エラーメッセージからみた予想です。
form_with(model: @user, builder: で呼ばれるclassはActionView::Helpersのnamespaceに有ることを期待されている、
しかし FormHelper::FormWithErrorMessageBuilder はそこにない。

::FormHelper::FormWithErrorMessageBuilder と書いてみるとどうなりますか?

もしくは

投稿2020/06/27 23:02

winterboum

総合スコア23284

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

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

Kiyobun510

2020/06/28 15:43

ご連絡遅くなり申し訳ありません。 ご回答ありがとうございます。 無事エラーなく実行されました! 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問