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

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

ただいまの
回答率

88.64%

Ruby on Railsのエラー「undefined method `each' for nil:NilClass」

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 234

yukikaze223

score 5

Ruby on Railsで下記のようなエラーが発生したのですが解決策がわかりません。
わかるかたご教授お願いします。

NoMethodError in Users#likes

undefined method `each' for nil:NilClass

恐らくlikes.html.erbのどこかがおかしいのだと思います

_microposts.html.erb

<ul class="list-unstyled">
  <% microposts.each do |micropost| %>
    <li class="media mb-3">
      <img class="mr-2 rounded" src="<%= gravatar_url(micropost.user, { size: 50 }) %>" alt="">
      <div class="media-body">
        <div>
          <%= link_to micropost.user.name, user_path(micropost.user) %><span class="text-muted"> posted at <%= micropost.created_at %></span>
        </div>
        <div>
          <p class="mb-0"><%= micropost.content %></p>
        </div>
        </br>

        <div>
          <% if current_user.checksub?(micropost) %>
            <%= form_with(model: current_user.favorites.find_by(micropost_id: micropost.id), local: true, method: :delete) do |f| %>
              <%= hidden_field_tag :micropost_id, micropost.id %>
              <%= f.submit 'お気に入り解除', class: 'btn btn-danger' %>
            <% end %>
          <% else %>
            <%= form_with(model: current_user.favorites.build, local: true) do |f| %>
              <%= hidden_field_tag :micropost_id, micropost.id %>
              <%= f.submit 'お気に入り登録', class: 'btn btn-primary' %>
            <% end %>
          <% end %>
        </div>
        </br>

        <div>
          <% if current_user == micropost.user %>
            <%= link_to "Delete", micropost, method: :delete, data: { confirm: "You sure?" }, class: "btn btn-danger btn-sm" %>
          <% end %>
        </div>
      </div>
    </li>
  <%= paginate microposts %>
</ul>
  <% end %>

likes.html.erb

<div class="row">
  <aside class="col-sm-4">
    <div class="card">
      <div class="card-header">
        <h3 class="card-title"><%= @user.name %></h3>
      </div>
      <div class="card-body">
        <img class="rounded img-fluid" src="<%= gravatar_url(@user, { size: 500 }) %>" alt="">
      </div>
    </div>
    <%= render 'microposts/microposts', microposts: @microposts %>
  </aside>
  <div class="col-sm-8">
    <ul class="nav nav-tabs nav-justified mb-3">
      <li class="nav-item"><a href="<%= user_path(@user) %>" class="nav-link <%= 'active' if current_page?(user_path(@user)) %>">Microposts  <span class="badge badge-secondary"><%= @count_microposts %></span></a></li>
      <li class="nav-item"><a href="<%= followings_user_path(@user) %>" class="nav-link <%= 'active' if current_page?(followings_user_path(@user)) %>">Followings  <span class="badge badge-secondary"><%= @count_followings %></span></a></li>
      <li class="nav-item"><a href="<%= followers_user_path(@user) %>" class="nav-link <%= 'active' if current_page?(followers_user_path(@user)) %>">Followers  <span class="badge badge-secondary"><%= @count_followers %></span></a></li>
      <li class="nav-item"><a href="<%= likes_user_path(@user) %>" class="nav-link <%= 'active' if current_page?(likes_user_path(@user)) %>">Likes  <span class="badge badge-secondary"><%= @count_likes %></span></a></li>
    </ul>
    <%= render 'users', users: @favorites %>
  </div>
</div>

microposts_controller.rb

class MicropostsController < ApplicationController
  before_action :require_user_logged_in
  before_action :correct_user, only: [:destroy]

  def create
    @micropost = current_user.microposts.build(micropost_params)
    if @micropost.save
      flash[:success] = "メッセージを投稿しました。"
      redirect_to root_url
    else
      @microposts = current_user.feed_microposts.order(id: :desc).page(params[:page])
      flash.now[:danger] = "メッセージの投稿に失敗しました。"
      render "toppages/index"
    end
  end

  def destroy
    @micropost.destroy
    flash[:success] = "メッセージを削除しました。"
    redirect_back(fallback_location: root_path)
  end

  private

  def micropost_params
    params.require(:micropost).permit(:content)
  end

  def correct_user
    @micropost = current_user.microposts.find_by(id: params[:id])
    unless @micropost
     redirect_to root_url
    end
  end
end

users_controller.rb

class UsersController < ApplicationController
  before_action :require_user_logged_in, only: [:index, :show, :followings, :followers, :likes]

  def index
    @users = User.order(id: :desc).page(params[:page]).per(25)
  end

  def show
    @user = User.find(params[:id])
    @microposts = @user.microposts.order(id: :desc).page(params[:page])
    counts(@user)
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)

    if @user.save
      flash[:success] = 'ユーザを登録しました。'
      redirect_to @user
    else
      flash.now[:danger] = 'ユーザの登録に失敗しました。'
      render :new
    end
  end

  def followings
    @user = User.find(params[:id])
    @followings = @user.followings.page(params[:page])
    counts(@user)
  end

  def followers
    @user = User.find(params[:id])
    @followers = @user.followers.page(params[:page])
    counts(@user)
  end

  def likes
    @user = User.find(params[:id])
    @likes = @user.likes.page(params[:page])
    counts(@user)
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
end

イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Mashiro

    2020/06/19 17:36

    コントローラーのrbの内容を載せていただくことは可能ですか?

    キャンセル

  • yukikaze223

    2020/06/19 17:42

    コントローラーの追加をして編集しました

    キャンセル

  • yukikaze223

    2020/06/19 17:42

    作成途中なのでおかしい部分もありますがよろしくお願いします

    キャンセル

回答 1

0

likes.html.erbの11行目の<%= render 'microposts/microposts', microposts: @microposts %>って<%= render 'microposts/micropost', microposts: @microposts %>じゃないかな?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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