ruby on rails - Dependencia circular detectada con constante de carga automática(Rails 4, Ruby 2)
ruby-on-rails sqlite (1)
El problema no fue ninguno de estos. En realidad, mi modelo de Paint contenía un campo llamado :type , que es una palabra clave reservada para metaclase o algo así. #RubyOnRails a la #RubyOnRails de #RubyOnRails ayudó afortunadamente, de lo contrario, un novato como yo habría intentado comenzar de cero, tropezar con el mismo problema y nunca lo habría descubierto. Espero que esto ayude a un futuro miembro de Google. ¡Pagalo despues!
configs / routes.rb Shutters y Paints son recursos secundarios de Jobs .
resources :jobs do
resources :shutters
resources :paints
end
app / models / job.rb Un Job contiene muchos Shutters y muchas 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? }`
app / models / shutter.rb Un Shutter contiene pertenece a un Job y una Paint .
class Shutter < ActiveRecord::Base
belongs_to :job
belongs_to :paint
app / models / paint.rb Una Paint pertenece a un Job pero puede ser referenciada por muchos Shutters en ese trabajo.
class Paint < ActiveRecord::Base
belongs_to :job
has_many :shutters
Tanto Jobs#show como Jobs#edit funcionan bien con el código <%= debug @job.paints %> si ya no hay Paints en la base de datos. Pero en el momento en que se agrega una pintura, se genera un RuntimeError, "Dependencia circular detectada mientras se carga automáticamente la PINTURA constante".
¿Cuál es la mejor manera de corregir este error?
Editar: información del controlador
app / controllers / 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
app / controllers / 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
app / controllers / 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