書籍’’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ボタンを押すと、
その場に書いた情報は残るが、エラーメッセージがアラート表示されない
確認したこと
- app/views/shared/_error_message の if 文の外であれば文字を、views/users/newの一部分として表示させることはできた
- app/views/shared/_error_message の if 文の外で <%= @user.errors.any? %> を表示されるとどのような値をinputとしても常にfalseが表示される
- /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でインスタンス変数を引き渡す方法を調べ、様々な方法で引き渡したのですがうまく表示させることができませんでした。
自分なりに考えてみましたが、解決できませんでした。
長文になってしまいましたが最後まで目を通していただきありがとうございます。
もし何か解決策、改善点、追加で必要になり得る情報がありましたらアドバイスをお願いします
回答2件
あなたの回答
tips
プレビュー