RailsコントローラーはJSONを受け入れませんか?
-
03-07-2019 - |
質問
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