Контроллер Rails не принимает JSON?
-
03-07-2019 - |
Вопрос
Я пытаюсь создать объект ActiveRecord с помощью запроса JSON.Однако контроллеру не удается установить переменные, переданные в параметрах во вновь созданном объекте.Например, объект person имеет два поля:имя и фамилия.
JSON, сгенерированный функцией JSON.stringify библиотеки JSON.org выдает:
{"firstname" : "Joe" , "lastname" : "Bloggs"}
Однако контроллер ожидает, что JSON будет иметь форму:
{ "Person" : {"firstname" : "Joe" , "lastname" : "Bloggs"} }
Я знаю, что в обычном ходе событий (для HTTP-запросов) параметры для запроса вложены в имя класса создаваемой модели .
Действие создания в контроллере является:
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 для передачи вашим контроллерам?
ТИА, Адам
Решение
Если вы просто передаете хэш всех параметров person (а не вложенный хэш с "person" в качестве ключа), то вы должны просто быть в состоянии сделать @person = Person.new(params)
.
Другие советы
Что касается ActiveRecord 3.0.7, вы можете просто добавить
self.include_root_in_json = false
к вашей модели (person.rb), чтобы избавиться от корневой ({ "Person" :") части.
Поочередно,
Person.new(params.reject{|k,v| k != "firstname" || k != "lastname"})
подошло бы в вашем Ruby....
Person.new({:firstname => params[:firstname], :lastname => params[:lastname]})
-- это действительно работает
Вот более надежное на будущее решение:
Person.new(params.reject{|k,v| not Person.column_names.include?(k) })
Одна из идей для разрешения плоского ввода в формате JSON, такого как {"firstname":"Джо", "фамилия":"Bloggs"} и вложенный вид, который вы получите с помощью HTML-формы, будет:
@person = Person.new(params[:person] || params)
respond_to do |format|
..
end