سؤال

لدي كائن طلب ، والذي يحتوي على طريقة إنشاء مثل هذه:

 def create
    @order                           = Order.new(params[:order])
    # @order.status_id = "1"

    respond_to do |format|
      if @order.save
        flash[:notice]               = 'Order was successfully created.'
        format.html { redirect_to(@order) }
        format.xml  { render :xml    => @order, :status => :created, :location => @order }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml    => @order.errors, :status => :unprocessable_entity }
      end
    end
  end

أرغب في تعيين @order status_id على "1" ، لذلك لدي

 @order.status_id = "1" 

لكن هذا الرمز لا يعمل ، بعد أن أقوم بإلغاء تحديده ، لا يزال من الممكن حفظ "1" في الحالة في DB ، ولكن يمكن لتخزين السمات الأخرى بنجاح.

order.rb

class Order < ActiveRecord::Base
  has_many :order_items
  belongs_to :status

end
هل كانت مفيدة؟

المحلول

يجب أن تكون قادرًا على تعيين قيمة سلسلة لمفتاح العلاقة وسيتم تحويلها كما هو مطلوب. تأتي المعاملات دائمًا كخيوط ، لذلك من الواضح أن هذا يجب أن يحدث لأي شيء يعمل.

هذا هو نوع الموقف الذي سيساعد فيه اختبار الوحدة القوي على تضييق نطاق المشكلة. قد يكون واحد من:

  • هناك attr_accessor محدد لـ status_id الذي يحظر المهمة.
  • هناك status_id = method محدد الذي يحظر المهمة.
  • يتم إعادة تعيين status_id أثناء A قبل _validation أو قبل _Save Call.

تريد إنشاء روتين اختبار يتحقق من هذا: يعمل:

def test_status_assignment
  order = Order.new

  order.status_id = '1'

  order.save

  assert_equal 1, order.status_id
end

نصائح أخرى

يمكن أن يكون attr_accessible في النموذج الخاص بك يمنعك من التعيين إلى هذا الحقل. يفعل هذا باستخدام القائمة البيضاء من الحقول المعتمدة.

يتغيرون @order.status_id = "1" ل @order.status_id = 1

قد يقرأ روبي "1" كسلسلة (من المفترض أن تفعل) بدلاً من عدد صحيح (ما تبحث عنه على الأرجح). عندما تقوم بإزالة عروض الأسعار ، فإن روبي سوف يفسرها على أنها عدد صحيح. إذا كان عليك تركها كسلسلة ، فحاول شيئًا مثل my_string.to_i أو "123".to_i.

إذا لم ينجح هذا ، فيرجى نشر أي رسالة خطأ تتلقاها.

هذه

@order.status_id = "1"

يجب ان يكون

@order.status_id = 1

أو ربما

@order.status = Status.find_by_id(1)

إذا كان لديك علاقات تم إعدادها بشكل جيد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top