代码之家  ›  专栏  ›  技术社区  ›  Doge

nil:NilClass的未定义方法“each”——但为什么?

  •  0
  • Doge  · 技术社区  · 7 年前

    我想创建一个ruby应用程序来检查服务器的状态是向上还是向下。

    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 %>
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Sebastián Palma    7 年前

    你在尝试迭代 @pings 都在房间里 @services 迭代,但这尚未定义,您只定义了服务,如果其中的对象 each 正在应用的具有 nil 价值

    无论用于渲染视图的控制器是什么,都需要定义两个实例变量,请尝试:

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