1. ホーム
  2. ruby-on-rails

[解決済み] nil:NilClass の未定義メソッド `each' - しかし、なぜ?

2022-02-11 12:12:41

質問

サーバーの状態がupかdownかをチェックするrubyアプリを作りたいのですが。 後で私は多様な構文で方法を見つけるために私のjsonパスを適合させる方法を見つけるでしょう。しかし、今のところ、私は汚い "undefined method `each' for nil:NilClass" で立ち往生しています。

コントローラにPingを打ちます。

def index
    @pings = Ping.all
  end

  def new
    @service = Ping.new
  end

  def create
    @ping = Ping.new(ping_params)
    @ping.service = @service
    @ping.up = test_ping
    @ping.save
  end

  def test_ping
    require 'json'
    require 'open-uri'

    url = 'https://www.facebook.com/platform/api-status/'
    fb_status_serialized = open(url).read
    fb_status = JSON.parse(fb_status_serialized)

    if fb_status['current']['health'] == 1
      test_ping = true
    else
      test_ping = false
    end
  end

  private

  def ping_params
    params.require(:ping).permit(:service_id, :up)
  end

  def set_ping
    @ping = Ping.find(params[:ping_id])
  end
end

サービスコントローラです。

(以下は、私が追加したいサービスのセットアップです)

class ServiceController < ApplicationController

  before_action :set_service, only: [:edit, :show, :destroy]

  def index
    @services = Service.all
  end

  def new
    @service = Service.new
  end

  def edit
  end

  def show
  end

  def create
    @service = Service.new(service_params)
    @service.save
      if @service.save
    redirect_to service_path(@service)
    else
      render :new
    end
  end

  def destroy
    @service.destroy
    @service.destroy
    redirect_to services_path
  end

private
    def set_service
      @service = Service.find(params[:id])
    end
    def service_params
      params.require(:service).permit(:name, :web_api, :json_path)
    end

end

ビュー(サービスインデックス)。

<%= @services.each do | s | %>
  <p><%= s.name %></p>
  <p><%= s.web_api %></p>
  <p><%= s.json_path %></p>
  <p><%= s.id %></p>

  <%= @pings.each do | p | %>
    <%# if p.service_id == s.id  %>
    <!-- undefined -->
  <% end %>

  <p>|||</p> <%= Ping.new(up: true, service: s ) %> <p>|||</p>
<% end %>

解決方法は?

を反復処理しようとしています。 @pings の中にある @services が定義されていない場合、サービスのみを定義していることになり、pings のイテレーションが機能しなくなります。 each が適用されている場合は nil の値を指定します。

ビューのレンダリングに使用しているコントローラが何であれ、両方のインスタンス変数を定義する必要があるので、試してみてください。

def index
  @services = Service.all
  @pings = Ping.all
end