質問

JSONリクエストを介してActiveRecordオブジェクトを作成しようとしています。ただし、コントローラーは、新しく作成されたオブジェクトのパラメーターで渡された変数の設定に失敗します。例として、人物オブジェクトには、名と姓の2つのフィールドがあります。

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?

TIA、 アダム

役に立ちましたか?

解決

(「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) })

{" firstname&quot ;:" Joe"、" lastname&quot ;:" Bloggs"}などのフラットなJSON入力を許可するための1つのアイデアと、HTMLフォームで取得するネストされた種類:

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

respond_to do |format|
  ..
end
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top