Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “如何修复”;NoMethodError(未定义的方法[]';用于nil:NilClass):app/controllers/…”;_Javascript_Ruby On Rails - Fatal编程技术网

Javascript “如何修复”;NoMethodError(未定义的方法[]';用于nil:NilClass):app/controllers/…”;

Javascript “如何修复”;NoMethodError(未定义的方法[]';用于nil:NilClass):app/controllers/…”;,javascript,ruby-on-rails,Javascript,Ruby On Rails,我正在使用rails构建一个页面,创建新的“人”(people/new),但不使用表单。使用javascript,我扫描带有用户输入的页面,最终得到如下所示的javascript对象: obj = { name: "John", age: 30, city: "New York" }; 然后,我使用javascript向控制器发送post请求: fetch('/people', { method: 'POST', user_params: stringified }) .the

我正在使用rails构建一个页面,创建新的“人”(people/new),但不使用表单。使用javascript,我扫描带有用户输入的页面,最终得到如下所示的javascript对象:

obj = { name: "John", age: 30, city: "New York" };
然后,我使用javascript向控制器发送post请求:

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
这是我的控制器:

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
params[:user_params[:age]]
而不是

params[:user_params][:age]
这给了我一个错误

TypeError (no implicit conversion of Symbol into Integer)
然而,我相信,在网上看了很长时间后,这种改变是错误的

仅供参考,这里是输入为空时变量“stringified”的样子

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

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

除非我遗漏了什么,否则您的JSON不会遵循通常的Rails格式,即具有顶级“user”键,例如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

这将需要您为控制器创建一个“显示”操作以及一个视图。除非我遗漏了什么,否则您的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

这将要求您为控制器创建一个“显示”操作,并创建一个视图来执行该操作。

似乎您正在尝试访问不存在的值,或者访问的值的组织方式与代码预期的不同。在Ruby中尝试访问散列中的嵌套值时,如果在任何时候,其中一个键丢失或值为
nil
,则会出错,因为
nil
没有用于
[]
的方法,您将链接该方法以访问下一个值

如果不希望参数丢失出现500错误,可以使用
dig
,它将安全地返回
nil
,而不是抛出错误。但这不是您应该做的,我包含这一点是为了帮助提供上下文,说明为什么这会发生在您的代码中

params.dig(:user_params, :name)
如果由于
user_params
必须在那里,因此确实要抛出错误,请使用
require
。然后,要访问创建所需的值,应使用
permit
仅允许这些值。这是为了保护你免受恶意的人插入他们想要的任何其他参数的伤害,如果你不保护自己,就像是一个管理标志

params.require(:user_params).permit(:name, :age, :city)

看起来您试图访问的值要么不存在,要么组织方式与代码预期不同。在Ruby中尝试访问散列中的嵌套值时,如果在任何时候,其中一个键丢失或值为
nil
,则会出错,因为
nil
没有用于
[]
的方法,您将链接该方法以访问下一个值

如果不希望参数丢失出现500错误,可以使用
dig
,它将安全地返回
nil
,而不是抛出错误。但这不是您应该做的,我包含这一点是为了帮助提供上下文,说明为什么这会发生在您的代码中

params.dig(:user_params, :name)
如果由于
user_params
必须在那里,因此确实要抛出错误,请使用
require
。然后,要访问创建所需的值,应使用
permit
仅允许这些值。这是为了保护你免受恶意的人插入他们想要的任何其他参数的伤害,如果你不保护自己,就像是一个管理标志

params.require(:user_params).permit(:name, :age, :city)

按照您的建议更改控制器后,错误消息已更改:2019-01-14 14 14:45:35+0100由PeopleController处理的127.0.0.1的“开始发布”/“人员”↳ app/controllers/people_controller.rb:16人创建(1.0ms)插入“人”(“城市”、“创建时间”、“更新时间”)值($1,$2,$3),返回“id”[[“城市”]、[:城市]、[“创建时间”、“2019-01-14 13:45:35.409632”]、[“更新时间”、“2019-01-14 13:45:35.409632”]↳ app/controllers/People\u controller.rb:16``和第二部分:`(0.7ms)提交↳ app/controllers/rPeople_controller.rb:16找不到PeopleController的模板#创建,渲染头:无内容完成204无内容在224ms内(ActiveRecord:2.4ms)``按照您的建议更改控制器后,错误消息已更改:`Started POST”/people'对于2019-01-14 14:45:35+0100时的127.0.0.1,由PeopleController处理#创建为/↳ app/controllers/people_controller.rb:16人创建(1.0ms)插入“人”(“城市”、“创建时间”、“更新时间”)值($1,$2,$3),返回“id”[[“城市”]、[:城市]、[“创建时间”、“2019-01-14 13:45:35.409632”]、[“更新时间”、“2019-01-14 13:45:35.409632”]↳ app/controllers/People\u controller.rb:16``和第二部分:`(0.7ms)提交↳ app/controllers/rPeople_controller.rb:16找不到PeopleController的模板#创建、渲染头部:无内容完成204无内容在224ms内完成(ActiveRecord:2.4ms)``我在上面的对话中看到,您似乎已经解决了这一部分。希望这能帮助下一个人。为了帮助您,您似乎没有匹配的视图文件
app/views/people/create。(无论您需要什么类型的文件)
。Rails正在查找一个基于控制器名称和操作的文件,因为