문제

JSON 요청을 통해 activeRecord 객체를 만들려고합니다. 그러나 컨트롤러는 새로 생성 된 객체의 매개 변수에 전달 된 변수를 설정하지 않습니다. 예를 들어, Person Object에는 FirstName과 LastName의 두 필드가 있습니다.

json.org 라이브러리의 JSON.stringify 기능이 생성 한 JSON이 생성됩니다.

{"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 요청을 처리하는 가장 깔끔한 방법은 무엇입니까? 또는 컨트롤러로 전달하기 위해 JavaScript 객체에서 "올바른"JSON을 어떻게 생성합니까?

티아, 아담

도움이 되었습니까?

해결책

모든 사람 매개 변수의 해시를 전달하는 경우 ( "사람"을 키로 사용하는 중첩 될 대신) 할 수 있어야합니다. @person = Person.new(params).

다른 팁

ActiveRecord 3.0.7은 추가 할 수 있습니다

self.include_root_in_json = false

루트 ({ "person": ") 부분에서 제거하기 위해 모델 (person.rb)에.

번갈아, Person.new(params.reject{|k,v| k != "firstname" || k != "lastname"}) 당신의 루비에서 할 것입니다.

...

Person.new({:firstname => params[:firstname], :lastname => params[:lastname]}) - 이것은 실제로 작동합니다

다음은보다 미래의 방지 솔루션입니다.

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

{ "FirstName": "Joe", "LastName": "Bloggs"}와 같은 Flat JSON 입력을 허용하는 한 가지 아이디어는 다음과 같습니다.

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

respond_to do |format|
  ..
end
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top