nil:NilClass 的未定义方法 `each' - 但为什么呢?

undefined method `each' for nil:NilClass - But why?

我想创建一个 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 %>

您正在尝试遍历 @services 迭代中的 @pings,但这尚未定义,您只定义了服务,ping 中的迭代不会'如果应用 each 的对象具有 nil 值,则无法正常工作。

无论您使用什么控制器来呈现视图,您都需要定义两个实例变量,尝试使用:

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