Rails контроллер не принимает JSON? - PullRequest
8 голосов
/ 06 января 2009

Я пытаюсь создать объект 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 для передачи вашим контроллерам?

ТИА, Адам

Ответы [ 4 ]

4 голосов
/ 06 января 2009

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

1 голос
/ 23 июня 2011

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

self.include_root_in_json = false

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

0 голосов
/ 26 июля 2009

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

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

respond_to do |format|
  ..
end
0 голосов
/ 06 января 2009

С другой стороны, 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) })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...