Вопрос

Я пытаюсь создать объект 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top