ruby on rails - الكشف عن التبعية الدائرية في حين أوتولودينغ ثابت(القضبان 4، روبي 2)



ruby-on-rails sqlite (1)

ولم تكن المشكلة أي من هذه المشاكل. كان في الواقع أن نموذج Paint بي يحتوي على حقل اسمه :type ، وهي كلمة رئيسية محجوزة للتصنيف التلوي أو شيء من هذا القبيل. وقد ساعده الحمد لله من قبل الناس في #RubyOnRails ، وإلا مبتدئ مثل مثلي حاولت أن تبدأ من الصفر، واجهت نفس المشكلة، وكان لن يكون قد أحسب هذا. نأمل أن يساعد ذلك بعض موظفي غوغل في المستقبل. دفعها إلى الأمام!

كونفيغس / ways.rb Shutters Paints هي سوبرسورسز Jobs .

resources :jobs do
    resources :shutters
    resources :paints
end

أب / موديلز / job.rb Job تحتوي على العديد من Shutters والعديد من Paints .

class Job < ActiveRecord::Base
    has_many :shutters, dependent: :delete_all
    has_many :paints, dependent: :delete_all

    accepts_nested_attributes_for :shutters, allow_destroy: true, :reject_if => lambda { |a| a[:no].blank? }
    accepts_nested_attributes_for :paints, allow_destroy: true, :reject_if => lambda { |a| a[:name].blank? }`

التطبيق / نماذج / shutter.rb Shutter يحتوي ينتمي إلى Job واحدة ودهان واحد.

class Shutter < ActiveRecord::Base
    belongs_to :job
    belongs_to :paint

أب / موديلز / paint.rb Paint ينتمي إلى Job واحدة ولكن يمكن الرجوع إليها من قبل العديد من Shutters في هذه المهمة.

class Paint < ActiveRecord::Base
    belongs_to :job
    has_many :shutters

كل من Jobs#show أند Jobs#edit العمل بشكل جيد مع التعليمات البرمجية <%= debug @job.paints %> إذا لم يكن هناك Paints بالفعل في قاعدة البيانات. ولكن لحظة إضافة الطلاء، يتم رفع رونتيميرور، "الكشف عن التبعية الدائرية أثناء أوتولودينغ ثابت الطلاء".

ما أفضل طريقة لإصلاح هذا الخطأ؟

تحرير: معلومات تحكم

التطبيق / وحدات التحكم / jobs_controller.rb

class JobsController < ApplicationController
    before_action :set_job, only: [:show, :edit, :update, :destroy]

    ...

    # GET /jobs/1
    # GET /jobs/1.json
    def show
    end

    # GET /jobs/new
    def new
        @job = Job.new
        @job.shutters.build
        @job.paints.build
    end

    # GET /jobs/1/edit
    def edit
        @job.shutters.build
        @job.paints.build
    end

التطبيق / وحدات التحكم / shutters_controller.rb

class ShuttersController < ApplicationController
    def new
        @shutter = Shutter.new
    end

    def destroy
        @shutter = Shutter.find(params[:id])
        @job = Job.find(@shutter[:job_id])
        @shutter.destroy
        respond_to do |format|
            format.html {redirect_to @job, notice: 'Shutter was succesfully deleted.' }
        end
    end
end

التطبيق / وحدات التحكم / paints_controller.rb

class PaintsController < ApplicationController
    def new
        @paint = Paint.new
    end

    def destroy
        @paint = Paint.find(params[:id])
        @job = Job.find(@paint[:job_id])
        @paint.destroy
        respond_to do |format|
            format.html {redirect_to @job, notice: 'Paint was succesfully deleted.' }
        end
    end
end




ruby-2.1