Как исправить «NoMethodError (неопределенный метод [] 'для nil: NilClass): app / controllers / ...» - PullRequest
0 голосов
/ 14 января 2019

Я использую рельсы и создаю страницу, которая создает новых «людей» (people / new), но без использования форм. Используя 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

Я попытался изменить синтаксис при создании в контроллере:

params[:user_params[:age]]

вместо

params[:user_params][:age]

Что дает мне ошибку

TypeError (no implicit conversion of Symbol into Integer)

Тем не менее, я очень долго смотрел в Интернете, что это изменение было неверным.

К вашему сведению, вот как выглядит переменная "stringified", когда входные данные пусты

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

Я хочу, чтобы отправленная информация (user_params) сохранялась в базе данных.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Похоже, что вы пытаетесь получить доступ к значениям, которых либо нет, либо они организованы не так, как ожидает ваш код. При попытке получить доступ к вложенным значениям в Hash в Ruby, если в какой-то момент один из ключей отсутствует или значение равно nil, произойдет ошибка, поскольку nil не имеет метода для [], которым вы являетесь цепочка для доступа к следующему значению.

Если вы не хотите, чтобы ошибка 500 отсутствовала, вы можете использовать dig, и она будет безопасно возвращать nil вместо того, чтобы выдавать ошибку. Но это не тот способ, которым вы должны это делать, я включаю это, чтобы помочь определить контекст , почему это может происходить с вашим кодом.

params.dig(:user_params, :name)

Если вы хотите выдать ошибку, потому что клавиша user_params содержит , используйте require. Затем, чтобы получить доступ к значениям, которые вы хотите создать, вы должны использовать permit, чтобы разрешить только эти значения. Это сделано для того, чтобы защитить вас от злоумышленника, вставляющего любой другой параметр, который он хочет, что-то столь же неприятное, как флаг администратора, если вы не защищаете себя.

params.require(:user_params).permit(:name, :age, :city)
0 голосов
/ 14 января 2019

Если я что-то не упустил, ваш JSON не соответствует обычному формату Rails с ключом пользователя верхнего уровня, например, params [: user] [: name]. Вы создаете объект без ключа верхнего уровня, поэтому просто выполните:

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

Также вы можете посмотреть в консоли Rails, как выглядит объект params. Если это все еще не работает, вставьте вывод вашей консоли.

Редактировать:

Теперь похоже, что ваша личность создается из ваших комментариев, после чего вам нужно что-то делать. * 1008 например *

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

Это потребует от вас создания действия «show» для вашего контроллера, а также для представления с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...