条件分岐でelseの処理が実行されない
現在ツイッタークローンアプリをrailsで開発しています。
Userが投稿をする際に、空白または140文字を超える場合に投稿ができないようにバリデーションを設定しました。
Viewではeach文を使用して全Userの投稿が見られるようになっております。
バリデーションをチェックしようと思い、空白で投稿をしてみたところundefined method `each' for nil:NilClass
というエラーが出ました。
PostModel
1class Post < ApplicationRecord 2 3 belongs_to :user 4 5 validates :body, presence: true, length: { maximum: 140 } 6 7end
PostsController
1class PostsController < ApplicationController 2 3 before_action :authenticate_user! 4 5 def index 6 @post = Post.new 7 @posts = Post.all 8 end 9 10 def create 11 @post = Post.new(post_params) 12 @post.user_id = current_user.id 13 if @post.save 14 redirect_to post_path(@post.id) 15 flash[:notice]="トゥイート成功" 16 else 17 render "index" ←ここの処理がされていません。 18 end 19 end 20 21def post_params 22 params.require(:post).permit(:body, :image_id) 23 end
PostsView
1<div class="container"> 2 <h2>ホーム</h2> 3 <div class="row"> 4 <div class="col"> 5 <div class="new-posts"> 6 <%= form_with model: @post, local: true do |f| %> 7 <%= render 'layouts/error_messages', model: @post %> 8 <%= f.text_area :body, class: "col-xs-12" %> 9 <%= f.submit "トゥイートする", class: "btn btn-primary col-xs-12" %> 10 <% end %> 11 </div> 12 </div> 13 </div> 14 <div class="row"> 15 <table class="table"> 16 <tbody> 17 <% @posts.each do |post| %> ←問題の箇所 18 <!--ここの表示の仕方(トゥイートの表示のさせ方)は要検討です--> 19 <tr> 20 <td><%= link_to post.body, post_path(post.id) %></td> 21 <td><%= post.user.name if post.user %></td> 22 <%#= link_to_if post.user, post.user.name, user_path(post.user.id) %> 23 </tr> 24 <% end %> 25 </tbody> 26 </table> 27 </div> 28</div>
Started POST "/posts" for at 2021-09-16 23:19:56 +0000 Cannot render console from Allowed networks: Processing by PostsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"aaaaaaaaaa4JN4ZKDfpgKDkh3t/aaaaaaaaaaaaakxmo6KpBEMQP1g+WaaaaaaaaaoILUU2VU4A==", "post"=>{"body"=>""}, "commit"=>"トゥイートする"} User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 5], ["LIMIT", 1]] ↳ /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.6/lib/active_record/log_subscriber.rb:98 (0.1ms) begin transaction ↳ app/controllers/posts_controller.rb:13 User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 5], ["LIMIT", 1]] ↳ app/controllers/posts_controller.rb:13 (0.1ms) rollback transaction ↳ app/controllers/posts_controller.rb:13 Rendering posts/index.html.erb within layouts/application Rendered layouts/_error_messages.html.erb (2.4ms) Rendered posts/index.html.erb within layouts/application (6.1ms) Completed 500 Internal Server Error in 18ms (ActiveRecord: 0.3ms) ActionView::Template::Error (undefined method `each' for nil:NilClass): 14: <div class="row"> 15: <table class="table"> 16: <tbody> 17: <% @posts.each do |post| %> 18: <!--ここの表示の仕方(トゥイートの表示のさせ方)は要検討です--> 19: <tr> 20: <td><%= link_to post.body, post_path(post.id) %></td>
if @post.save!にして確認したところ
"body can't be blank"となったのでバリデーション自体はうまくいっているのかなと思っています。
elseの処理が行われないため、each文の処理ではpost.bodyがnilなのにeachできないよ!という認識で合っていますか?
解決方法が導き出せないため、どなたか回答お願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/17 00:23