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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

659閲覧

Railsサインアップページでのエラーメッセージ表示機能

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2022/01/18 05:09

編集2022/01/18 05:10

書籍’’Ruby on Railsチュートリアル’’に従って現在第7章を勉強中です。
ruby_version: 3.0.3
rails_version: 7.01

ユーザーの初回登録時に、
各項目の必要条件を満たしていない状態でアカウントをデータベースに保存しようとすると、
保存の失敗とエラーメッセージをページに表示させて修正を促すような機能を実装したいです。

Ruby

1#app/controllers/users_controller.rb 2 3 def new 4 @user = User.new 5 end 6 7 def create 8 @user = User.create(user_params) 9 if @user.save 10 puts "good job" 11 else 12 render 'new' 13 end 14 end 15 16 private 17 def user_params 18 params.require(:user).permit(:name, :email, :password, :password_confirmation) 19 end 20 21 22end

html.erb

1// app/views/users/new.html.erb 2 3<div> 4 <%= form_with(model: @user, local: true) do |f| %> 5 <%= render 'shared/error_message' %> 6 <div> 7 <%= f.label :name%> 8 <%= f.text_field :name%> 9 </div> 10 <div> 11 <%= f.label :email%> 12 <%= f.email_field :email%> 13 </div> 14 <div> 15 <%= f.label :password%> 16 <%= f.password_field :password"%> 17 </div> 18 <div> 19 <%= f.label :password_confirmation%> 20 <%= f.password_field :password_confirmation%> 21 </div> 22 <%= f.submit "Create my account"%> 23 <% end%> 24</div> 25

html.erb

1// app/views/shared/_error_message.html.erb 2 3<% if @user.errors.any? %> 4 5 <div id="error_explaination"> 6 <div class="alert"> 7 The form contaions <%= pluralize(@user.errors.count, "error")%> 8 </div> 9 <ul> 10 <% @user.errors.full_messages.each do |msg|%> 11 <li><%= msg %></li> 12 <% end %> 13 </ul> 14 </div> 15<% end %>

問題点

Newページでエラーが起きるであろう情報のみでsubmitボタンを押すと、
その場に書いた情報は残るが、エラーメッセージがアラート表示されない

確認したこと

  1. app/views/shared/_error_message の if 文の外であれば文字を、views/users/newの一部分として表示させることはできた
  2. app/views/shared/_error_message の if 文の外で <%= @user.errors.any? %> を表示されるとどのような値をinputとしても常にfalseが表示される
  3. /users_controllerのcreateアクション、@user = User.create(user_params) を User.create(params[:user]として設定していたときは、必要な情報を入力せずにsubmitボタンを押すとActiveModel::ForbiddenAttributesError in UsersController#create でエラーページが表示されていた。

自分なりの考え

上記の’’確認したこと’’から、renderのメゾットは正常に動作しているのでファイルの中のコード自体に問題があること、2, より if文の条件に常に当てはまっていないために何も表示されないこと、3, より入力された情報を評価するアルゴリズムのコードは間違っていないことがわかりました。
なので自分が考える原因は、submitでフィールドにある作りかけのデータをnewのページを経由してエラーメッセージのページに引き渡せていないのだと思います。

試したこと

考えをもとにgoogleでrenderでインスタンス変数を引き渡す方法を調べ、様々な方法で引き渡したのですがうまく表示させることができませんでした。

自分なりに考えてみましたが、解決できませんでした。
長文になってしまいましたが最後まで目を通していただきありがとうございます。
もし何か解決策、改善点、追加で必要になり得る情報がありましたらアドバイスをお願いします

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

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

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

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

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

MasaSakano

2022/01/19 23:57

partial (_error_*.html.erb) を使わずに、new.html.erb の中に直接書き込むとどうなりますか? 記載のpartialの書き方はお勧めではないものの、おそらく動くのでは、と思います……ただし、Rails 7で仕様が変わった可能性は否定しません。以前から良くないとは言われていたようなので。
退会済みユーザー

退会済みユーザー

2022/01/20 03:26

コメントありがとうございます。 new.html.erbにpartialの内容を直接書き込んでみましたが動きませんでした。コントローラー内でエラーをlogoutをすると予想通りのエラーメッセージを出力するのですが、new.html.erbに試しに@user.errors.any?を出力させると常にfalseを返してしまいます。
MasaSakano

2022/01/21 09:40

User.create(user_params) を User.new(user_params) に変更するとどうなりますか? (テストの時は、今回も、partialは使わずに html.erb直接書き込むことをお勧めします。単純化することで、意図通りの挙動をしない可能性がある場所を一つ減らすためです。)
guest

回答2

0

ベストアンサー

gemfile から"turbo-rails"を削除したところうまく動作する様になりました
ご回答くださった方、協力していただいた方、ありがとうございました。

投稿2022/01/27 07:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ruby

1# app/views/users/new.html.erb 2<%= render 'shared/error_messages', xxx: f.object %>

のようにフォームの情報をxxx(任意の名前)で呼び出せるように、render の第二引数として渡してあげて

ruby

1# app/views/shared/_error_message.html.erb 2この中にあると全ての@user を xxx と置換してみてください

投稿2022/01/24 09:11

polo

総合スコア108

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

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

退会済みユーザー

退会済みユーザー

2022/01/27 07:26

ご回答ありがとうございます。 poloさんの解決方法を試してみたのですが実現することができませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問