سؤال

أحاول إنشاء كائن 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top