【发布时间】:2014-07-10 13:00:58
【问题描述】:
configs/routes.rb
Shutters 和 Paints 是 Jobs 的子资源。
resources :jobs do
resources :shutters
resources :paints
end
app/models/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? }`
app/models/shutter.rb
一个Shutter 包含属于一个Job 和一个Paint。
class Shutter < ActiveRecord::Base
belongs_to :job
belongs_to :paint
app/models/paint.rb
Paint 属于一个 Job,但在该作业中可以被许多 Shutters 引用。
class Paint < ActiveRecord::Base
belongs_to :job
has_many :shutters
如果数据库中没有Paints,Jobs#show 和Jobs#edit 都可以正常使用代码<%= debug @job.paints %>。但是在添加油漆的那一刻,会引发 RuntimeError,“自动加载常量 PAINT 时检测到循环依赖”。
修复此错误的最佳方法是什么?
编辑:控制器信息
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
【问题讨论】:
-
添加“绘画”的控制器代码是什么样子的
-
@Iceman 在我的帖子中添加了控制器代码。
-
@Iceman 据我所知,不需要。他们的关键是
Shutter模型在相同的代码下工作得非常好。我只是为Paint控制器复制粘贴。两个模型的实际创建逻辑都在JobsController中。
标签: ruby-on-rails ruby sqlite ruby-on-rails-4 ruby-2.1