وحدة التحكم القضبان لا تقبل JSON؟
-
03-07-2019 - |
سؤال
أحاول إنشاء كائن ActivereCord عبر طلب JSON. ومع ذلك ، فشل وحدة التحكم في ضبط المتغيرات التي تم تمريرها في المعلمات في الكائن الذي تم إنشاؤه حديثًا. على سبيل المثال ، يحتوي كائن الشخص على حقلان: FirstName و LastName.
تقوم 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 كما تم إنشاؤها؟ أو بدلاً من ذلك ، كيف يمكنك إنشاء "JAST" الصحيح "من كائنات JavaScript لتمريرها إلى وحدات التحكم الخاصة بك؟
تيا ، آدم
المحلول
إذا كنت تمر فقط بجامع جميع معلمات الشخص (بدلاً من التجمع المتداخل مع "الشخص" كمفتاح) ، فيجب أن تكون قادرًا على القيام به @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"})
ستفعل في روبيك....
Person.new({:firstname => params[:firstname], :lastname => params[:lastname]})
- هذا يعمل في الواقع
إليك حل أكثر عزلًا في المستقبل:
Person.new(params.reject{|k,v| not Person.column_names.include?(k) })
فكرة واحدة للسماح بإدخال JSON المسطح مثل {"FirstName": "Joe" ، "LastName": "Bloggs"} والنوع المتداخل الذي تحصل عليه مع نموذج HTML سيكون:
@person = Person.new(params[:person] || params)
respond_to do |format|
..
end