Pergunta

Estou tentando criar um objeto ActiveRecord por meio de uma solicitação JSON.Porém o controlador não consegue definir as variáveis ​​passadas nos parâmetros do objeto recém-criado.Por exemplo, um objeto pessoa possui dois campos:nome e sobrenome.

O JSON gerado pela função JSON.stringify da biblioteca JSON.org produz:

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

No entanto, o controlador espera que o JSON esteja no formato:

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

Estou ciente de que, no curso normal dos eventos (para solicitações HTTP), os parâmetros da solicitação são aninhados sob o nome da classe do modelo que está sendo criado.

A ação de criação no controlador é:

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

Qual seria a maneira mais interessante para o controlador processar as solicitações JSON, conforme gerado?Ou, alternativamente, como você gera JSON "correto" a partir de objetos JavaScript para passar para seus controladores?

Tia, Adam

Foi útil?

Solução

Se você estiver apenas passando um hash de todos os parâmetros de pessoa (em vez de um hash aninhado com "pessoa" como chave), então você deverá ser capaz de fazer @person = Person.new(params).

Outras dicas

Quanto ao ActiveRecord 3.0.7, você pode simplesmente adicionar

self.include_root_in_json = false

ao seu modelo (person.rb) para se livrar da parte root ({ "Person":").

Alternativamente, Person.new(params.reject{|k,v| k != "firstname" || k != "lastname"}) faria no seu Ruby.

...

Person.new({:firstname => params[:firstname], :lastname => params[:lastname]}) - isso realmente funciona

Aqui está uma solução mais preparada para o futuro:

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

Uma ideia para permitir entrada JSON simples, como {"firstname":"Joe", "sobrenome":"Bloggs"} e o tipo aninhado que você obtém com um formulário HTML seria:

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

respond_to do |format|
  ..
end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top