Javascript “如何修复”;NoMethodError(未定义的方法[]';用于nil:NilClass):app/controllers/…”;
我正在使用rails构建一个页面,创建新的“人”(people/new),但不使用表单。使用javascript,我扫描带有用户输入的页面,最终得到如下所示的javascript对象: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
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正在查找一个基于控制器名称和操作的文件,因为