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