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

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

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

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

Ruby on Rails

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

解決済

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

hare2
hare2

総合スコア25

Ruby

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

Ruby on Rails

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

2回答

0評価

0クリップ

211閲覧

投稿2022/01/18 05:09

編集2022/01/27 16:28

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

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

Ruby

#app/controllers/users_controller.rb def new @user = User.new end def create @user = User.create(user_params) if @user.save puts "good job" else render 'new' end end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end end

html.erb

// app/views/users/new.html.erb <div> <%= form_with(model: @user, local: true) do |f| %> <%= render 'shared/error_message' %> <div> <%= f.label :name%> <%= f.text_field :name%> </div> <div> <%= f.label :email%> <%= f.email_field :email%> </div> <div> <%= f.label :password%> <%= f.password_field :password"%> </div> <div> <%= f.label :password_confirmation%> <%= f.password_field :password_confirmation%> </div> <%= f.submit "Create my account"%> <% end%> </div>

html.erb

// app/views/shared/_error_message.html.erb <% if @user.errors.any? %> <div id="error_explaination"> <div class="alert"> The form contaions <%= pluralize(@user.errors.count, "error")%> </div> <ul> <% @user.errors.full_messages.each do |msg|%> <li><%= msg %></li> <% end %> </ul> </div> <% 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でインスタンス変数を引き渡す方法を調べ、様々な方法で引き渡したのですがうまく表示させることができませんでした。

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

MasaSakano

2022/01/19 23:57

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

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直接書き込むことをお勧めします。単純化することで、意図通りの挙動をしない可能性がある場所を一つ減らすためです。)

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

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

Ruby on Rails

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