簡體   English   中英

如何解決“ NoMethodError(nil:NilClass的未定義方法[]”):應用程序/控制器/…”

[英]How to fix “NoMethodError (undefined method []' for nil:NilClass): app/controllers/…”

我正在使用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)存儲在數據庫中。

除非我缺少任何內容,否則您的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中的Hash中訪問嵌套值時,如果在任何時候都缺少一個鍵或值為nil則它將出錯,因為nil沒有用於[]的方法,您正在鏈接該方法來訪問下一個值。

如果您不希望因缺少參數而出現500錯誤,則可以使用dig ,它將安全地返回nil而不是拋出錯誤。 但這不是您應該這樣做的方式,我將其包括在內以幫助提供有關為何代碼可能發生這種情況的上下文。

params.dig(:user_params, :name)

如果你想拋出一個錯誤,因為user_params關鍵必須是有,然后使用require 然后訪問要用於創建的值,應使用permit僅允許這些值。 這是為了防止惡意程序插入您想要的其他任何參數,如果您不保護自己,這就像管理員標記一樣令人討厭。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM