如何修复“ NoMethodError(nil:NilClass的未定义方法[]'):应用程序/控制器/ ...”

时间:2019-01-14 14:24:24

标签: javascript ruby-on-rails

我正在使用Rails,并且正在构建一个页面,该页面创建新的“人员”(人员/新人员),但不使用表单。使用javascript,我用用户输入扫描页面,最后得到一个javascript对象,如下所示:

obj = { name: "John", age: 30, city: "New York" };

然后我使用javascript将发帖请求发送到控制器:

fetch('/people', {
    method: 'POST',
    user_params: stringified
})
.then((resp) => resp.json())
.then(function (data) {
    console.log(data)
})
.catch(function (error) {
    console.log(error)
})  

问题是,浏览器中的控制台指示错误500:

POST http://localhost:3000/reports 500 (Internal Server Error)
SyntaxError: Unexpected token < in JSON at position 0

在阅读终端时,出现以下错误,我认为这是问题的根源:

NoMethodError (undefined method `[]' for nil:NilClass):

app/controllers/people_controller.rb:16:in `create'

这是我的控制器:

class PeopleController < ApplicationController
  skip_before_action :verify_authenticity_token , only: [:create]

  def index
    @people = Person.all
  end

  def new
    @person = Person.new
  end

  def create
    Person.create(name: params[:user_params][:name], age: params[:user_params][:age], city: params[:user_params][:city])
  end
end

我尝试更改控制器中create的语法:

params[:user_params[:age]]

代替

params[:user_params][:age]

哪个给我错误

TypeError (no implicit conversion of Symbol into Integer)

但是,我相信,很长一段时间在网上看到的变化是错误的。

仅供参考,当输入为空时,变量“ stringized”看起来像这样

{"name":"","age":"","city":""}

我希望发送的信息(user_params)存储在数据库中。

2 个答案:

答案 0 :(得分:2)

除非我丢失了某些内容,否则您的JSON不遵循通常的具有顶级“用户”键的Rails格式,例如params [:user] [:name]。您正在创建没有顶级密钥的对象,所以只需执行以下操作:

Person.create(name: params[:name], age: params[:age], city: params[:city])

您还可以在Rails控制台中查看params对象的外观。如果仍然无法正常工作,请粘贴您的控制台输出。

编辑:

现在看来您是根据您的评论创建的人,之后需要做一些事情。例如

def create
   @person = Person.new(name: params[:name], age: params[:age], city: params[:city])

   if @person.save
     redirect_to @person
   else
     render :new
   end
end

这还需要您为控制器创建一个“显示”操作,并为其创建一个视图。

答案 1 :(得分:2)

您似乎正在尝试访问不存在的值,或者访问的结构与代码期望的值不同。尝试在Ruby中的Hash中访问嵌套值时,如果在任何时候都缺少其中一个键或值为D:\\python_workspace_31dec\\ mindsphere-sdk-python-clients ,则将出错,因为nil没有用于{{1的方法}},您将其链接以访问下一个值。

如果您不希望因缺少参数而出现500错误,可以使用nil,它将安全地返回[]而不是抛出错误。但这不是您应该这样做的方式,我将其包括在内以帮助提供有关为什么这可能在您的代码中发生的上下文。

dig

如果由于nil已经而要抛出错误,请使用params.dig(:user_params, :name) 。然后,要访问创建所需的值,应使用user_params仅允许这些值。这是为了保护您免受恶意程序插入他们想要的其他任何参数的侵害,如果您不保护自己,这就像admin标志一样令人讨厌。

require