Контроллер Rails не принимает JSON?

Я пытаюсь создать объект ActiveRecord с помощью запроса JSON. Однако контроллеру не удается установить переменные, переданные в параметрах вновь созданного объекта. Например, у объекта человека есть два поля: имя и фамилия.

JSON, сгенерированный функцией JSON.stringify библиотеки JSON.org, производит:

{"firstname" : "Joe" , "lastname" : "Bloggs"}

Однако контроллер ожидает, что JSON будет в форме:

{ "Person" : {"firstname" : "Joe" , "lastname" : "Bloggs"} }

Я знаю, что при нормальном ходе событий (для HTTP-запросов) параметры запроса вложены под имя класса модели создается.

Действие create в контроллере:

def create
    @person = Person.new(params[:person])

    respond_to do |format|
      if @person.save
        flash[:notice] = 'Person was successfully created.'
        format.html { redirect_to(@person) }
        format.xml  { render :xml => @person, :status => :created, :location => @person }
        format.json  { render :json => @person, :status => :created, :location => @person }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @person.errors, :status => :unprocessable_entity }
        format.json  { render :json => @person.errors, :status => :unprocessable_entity }
      end
    end
  end

Каким будет наиболее удобный способ для контроллера обрабатывать JSON? запросы как сгенерированы? Или, в качестве альтернативы, как создать «правильный» JSON из объектов Javascript для передачи вашим контроллерам?

TIA, Адам

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
8
0
5 969
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Если вы просто передаете хэш всех параметров человека (а не вложенный хеш с ключом «человек»), тогда вы должны просто иметь возможность выполнить @person = Person.new(params).

Будет ли это по-прежнему работать для стандартных HTML-запросов, или мне следует реорганизовать запросы JSON в отдельный метод?

apchester 06.01.2009 01:31

Нет. Вам действительно следует переписать ваши JSON-запросы, чтобы передавать те же параметры, что и через HTML.

Zach Langley 06.01.2009 07:46

Спасибо, Зак, я так и думал, но хотел убедиться в лучших практиках. Привет, Адам

apchester 06.01.2009 14:21

Alternately, Person.new(params.reject{|k,v| k != "firstname" || k != "lastname"}) would do in your Ruby.

...

Person.new({:firstname => params[:firstname], :lastname => params[:lastname]}) -- this actually works

Вот более надежное решение:

Person.new(params.reject{|k,v| not Person.column_names.include?(k) })

Это требует, чтобы вы правильно установили свои «защищенные» атрибуты, чтобы кто-то не смог пройти: isAdmin => true.

James Baker 17.10.2009 00:57

Одна из идей для разрешения простого ввода JSON, такого как {"firstname": "Joe", "lastname": "Bloggs"} и вложенного типа, который вы получаете с HTML-формой:

@person = Person.new(params[:person] || params)

respond_to do |format|
  ..
end

Что касается ActiveRecord 3.0.7, вы можете просто добавить

self.include_root_in_json = false

в вашу модель (person.rb), чтобы избавиться от корневой ({"Person": ") части.

Другие вопросы по теме