NoMethodError(对于nil:NilClass,未定义的方法“保存”)

时间:2018-06-26 10:24:51

标签: ruby-on-rails

我使用Ruby on Rails作为后端。创建记录时,会发生这样的错误:

  

在2018-06-26 15:09:31为127.0.0.1开始发布POST“ / spr_type_events”   +0500由SprTypeEventsController#create作为JSON参数进行处理:{“ spr_type_event” => {}}不允许的参数:   :spr_type_event在77毫秒内完成了500个内部服务器错误

     

NoMethodError(对于nil:NilClass,未定义的方法“保存”):

     

app / controllers / spr_type_events_controller.rb:17:在“创建”中

我已经不明白这里出了什么问题:

class SprTypeEventsController < ApplicationController
    before_action :set_spr_type_event, only: [:show, :update, :destroy]

    def index
        @spr_type_events = SprTypeEvent.all

        render json: @spr_type_events
    end

    def show
        render json: @spr_type_event
    end

    def create
        @spr_type_event = SprTypeEvent.new(spr_type_event_params)

        if @spr_turbodrill_type.save
            render json: @spr_type_event, status: :created, location: @spr_type_event
        else
            render json: @spr_type_event.erros, status: :unprocessable_entity
        end
    end

    def update
        if @spr_type_event.update(spr_type_event_params)
            render json: @spr_type_event
        else
            render json: @spr_type_event.errors, status: :unprocessable_entity
        end
    end

    def destroy
        @spr_type_event.destroy
    end

    private

    def set_spr_type_event
        @spr_type_event = SprTypeEvent.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def spr_type_event_params
        params.permit(
          :type_id,
          :date_begin,
          :date_end,
          :name,
          :comments
        )
    end
end

2 个答案:

答案 0 :(得分:1)

首先,您已经声明了一个像@spr_type_event这样的变量,但是在save这样的@spr_turbodrill_type进行连接时调用,因此更改它,例如:@spr_type_event.save请遵循以下修改的代码< / p>

def create
  @spr_type_event = SprTypeEvent.new(spr_type_event_params)

  if @spr_type_event.save
    render json: @spr_type_event, status: :created, location: @spr_type_event
  else
    render json: @spr_type_event.erros, status: :unprocessable_entity
  end
end

和类似这样的强参数方法,您可以保留要编写的代码的中断,但需要添加此require(:spr_type_event)

def spr_type_event_params
    params.require(:spr_type_event).permit(:type_id, :date_begin, :date_end, :name, :comments)
end

答案 1 :(得分:0)

您没有在控制器中的任何地方初始化@spr_turbodrill_type来创建方法,我认为@spr_type_event应该在那里。就像下面的代码一样

def create
  @spr_type_event = SprTypeEvent.new(spr_type_event_params)

  if @spr_type_event.save
    render json: @spr_type_event, status: :created, location: @spr_type_event
  else
    render json: @spr_type_event.erros, status: :unprocessable_entity
  end
end