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

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

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

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

Ruby

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

Q&A

解決済

1回答

1206閲覧

if文でelseが実行されない

tomomomo

総合スコア22

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2021/09/17 00:06

編集2021/09/17 00:21

条件分岐で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できないよ!という認識で合っていますか?
解決方法が導き出せないため、どなたか回答お願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

@posts.each の @posts が createで定義されていないからです。

2つ目の方は、エラーメッセージがないと、なんとも。

投稿2021/09/17 00:13

winterboum

総合スコア23567

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

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

tomomomo

2021/09/17 00:23

ありがとうございます! 簡単なところが抜けておりました・・・ 余談の方についても解決できました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問