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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

2616閲覧

undefined method `each' for nil:NilClassのエラーが解決しない

yusuke9814

総合スコア18

Ruby

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

Ruby on Rails

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

0グッド

2クリップ

投稿2019/06/17 05:29

編集2019/06/17 05:34

解決したい内容

railsにて投稿機能の作成中に発生した以下のエラーを解決したいです。
![イメージ説明

試したこと

こちらの記事を参考にし、@postsが空でないかを確認するため@posts を使っている部分をすべてコメントアウトして、<%= @posts.nil? %>をviewで確認したところ、falseが返ってきたため、その段階では空ではないと自分の中で判断しました。
しかしながら、posts_controller.rbindexアクション内にて、@postsのすぐ下にp @postsを記述し、ターミナルで出力を確認したところ
![イメージ説明
上の画像のように、#<ActiveRecord::Relation []>のように値が空で返ってきています。

この後、解決策を調べてみましたが、いい案は見つからず、コードの誤字脱字等も見ましたが見つかりませんでした。
何卒、解決策をご教授お願い致します。

コード

_post_form.html.erb

HTML

1<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> 2 <div class="modal-dialog" role="document"> 3 <div class="modal-content"> 4 5 <div class="modal-header"> 6 <h5 class="modal-title" id="exampleModalLabel">New Post</h5> 7 <button type="button" class="close" data-dismiss="modal" aria-label="Close"> 8 <span aria-hidden="true">&times;</span> 9 </button> 10 </div> 11 12 <%= form_with model: Post.new, local: true do |form| %> 13 <div class="modal-body"> 14 <div class="form-group"> 15 <%= form.label :title, 'Title:' %> 16 <%= form.text_field :title, class: 'form-control'%> 17 </div> 18 <div class="form-group"> 19 <div class="field_image"> 20 <div id="img_field" onClick="$('#file').click()"> 21 <%= image_tag("/pic_images/default_image.jpg") %> 22 </div> 23 <%= form.file_field :image_name, class: "image", style: "display:none;", id: "file"%> 24 </div> 25 </div> 26 <div class="form-group"> 27 <%= form.label :content, 'content:' %> 28 <%= form.text_area :content, class: 'form-control' , rows:3%> 29 </div> 30 </div> 31 <div class="modal-footer"> 32 <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> 33 <%= form.submit 'post', class: 'btn btn-primary' %> 34 </div> 35 <% end %> 36 37  </div> 38 </div> 39</div>

routes.rb

ruby

1Rails.application.routes.draw do 2 resources :posts, only: [:index,:create] 3 resources :users, only: [:create,:edit,:update] 4 post 'login', to: 'users#login' 5 post 'logout', to: 'users#logout' 6 root 'home#top' 7 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 8end

posts_controller.rb

ruby

1class PostsController < ApplicationController 2 3 4 def index 5 @posts = Post.page(params[:page]).per(4).order(created_at: :desc) 6 p @posts 7 end 8 9 def create 10 @post = Post.new(post_params) 11 if @post.save 12 @post.user_id = @current_user.id 13 flash[:success] = "投稿を作成しました" 14 redirect_to posts_path 15 else 16 render :index 17 end 18 end 19 20 private 21 def post_params 22 params.require(:post).permit(:title,:image_name,:content) 23 end 24 25end

index.html.erb

HTML

1<div class="posts-index"> 2 <div class="container"> 3 4 <%= render partial: 'post_form' %> 5 <%= render partial: 'user_modal'%> 6 7 <div class="post_card jscroll"> 8 <% @posts.each do |post| %> 9 <section class="card"> 10 <div class="card-content"> 11 <div class="user"> 12 <div class="card-user_image user_item"><%= image_tag post.user.image_name.to_s %></div> 13 <p class="user_item"><%= post.user.name %></p> 14 </div></br> 15 <p class="post_title"><%= post.title %></p> 16 <div class="post_image"><%= image_tag post.image_name.to_s %></div></br> 17 <p class="post_content"><%= simple_format(post.content) %></p> 18 </div> 19 </section> 20 <% end %> 21 <%= paginate @posts %> 22 </div> 23 24 </div> 25</div>

routes
![イメージ説明

バージョン

Rails 5.2.3
ruby 2.6.3

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

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

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

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

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

guest

回答2

0

createアクションの

else render :index end

ruby

1 else 2 @posts = Post.page(params[:page]).per(4).order(created_at: :desc) 3 render :index 4 end

ruby

1 else 2 redirect_to :index 3 end

に書き換えるとよいでしょう。

投稿2019/06/17 05:54

asm

総合スコア15147

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

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

yusuke9814

2019/06/17 06:23

ご回答ありがとうございます。 ご提示いただいた方法を試させていただいたところ、無事エラーが解決致しました。 また、始めにご回答いただいた方にもコメントをさせて頂きましたが、投稿の保存がうまく行っていないようで、全てrenderの方の処理に行ってしまう問題が発生してしまいました。 こちらはまた改めて質問を投稿しようと思います。 ご丁寧にありがとうございました。
guest

0

ベストアンサー

rb

1 def create 2 @post = Post.new(post_params) 3 if @post.save 4 @post.user_id = @current_user.id 5 flash[:success] = "投稿を作成しました" 6 redirect_to posts_path 7 else 8 # ここで@postsを再度取得していないのでrender :indexした際に@postsがnilになっている 9 render :index 10 end 11 end

renderする前に@postsを取得するかredirectするようにしてしまうことで解決すると思います。

投稿2019/06/17 05:52

編集2019/06/17 05:54
Mugheart

総合スコア2344

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

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

yusuke9814

2019/06/17 06:20

ご回答誠にありがとうございます。 ご提示いただいた、方法で試しましたところ、無事にエラーがなくなりました。 しかしながら、投稿の保存がうまく行っていないようで、全てrenderの方の処理に行ってしまう問題が発生致しました。 こちらはまた改めて質問を投稿しようと思います。 ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問