Я пытаюсь создать объект 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, Адам



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы просто передаете хэш всех параметров человека (а не вложенный хеш с ключом «человек»), тогда вы должны просто иметь возможность выполнить @person = Person.new(params).
Нет. Вам действительно следует переписать ваши JSON-запросы, чтобы передавать те же параметры, что и через HTML.
Спасибо, Зак, я так и думал, но хотел убедиться в лучших практиках. Привет, Адам
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.
Одна из идей для разрешения простого ввода 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": ") части.
Будет ли это по-прежнему работать для стандартных HTML-запросов, или мне следует реорганизовать запросы JSON в отдельный метод?