【发布时间】:2017-11-16 16:36:33
【问题描述】:
当我编辑具有嵌套属性的模型时,一切正常。如果我尝试使用嵌套属性创建新记录,嵌套属性不会出现在具有嵌套属性的表单上。我有两个模型如下
class JobSpec < ActiveRecord::Base
has_many :availabilities
accepts_nested_attributes_for :availabilities, allow_destroy: true
end
和
class Availability < ActiveRecord::Base
belongs_to :job_spec
end
在job_specs_controller我有
class JobSpecsController < ApplicationController
def new
@job_spec = JobSpec.new
@availabilities = Availability.none
availability = Availability.new
availability.job_spec = @job_spec
@availabilities << availability
end
def edit
@job_spec = JobSpec.find(params[:id])
@availabilities = @job_spec.availabilities
end
def job_spec_params
params.require(:job_spec).permit(
... all of the job_spec attributes,
availabilities_attributes: [:id, ... all of the availability attributes],
)
end
end
在_form job_spec 我有
<% @availabilities.each do |availability| %>
<%= f.fields_for availability do |builder| %>
<%= render partial: 'availabilities/form_mini',
locals: {f: builder, availability: availability} %>
<% end %>
<% end %>
由于编辑工作正常,我认为没有太大问题。有什么想法吗?
更新
我几乎解决了所有问题,但仍有一个问题。这就是我所做的。
1) 我必须构建 job_spec availabilities。 JobSpecsController 的新动作现在看起来像这样
def new
@job_spec = JobSpec.new
@job_spec.client_id = params[:client_id]
@job_spec.availabilities.build
end
2) 我希望能够销毁嵌套模型,因此我必须将带有嵌套属性的:_destroy 传递给job_spec_params。那个方法是这样的
def job_spec_params
params.require(:job_spec).permit(
... all of the job_spec attributes,
availabilities_attributes: [:id, :_destroy, ... all of the availability attributes],
)
end
end
3) 最后,我不得不将_form 更改为job_spec。我有
<%= f.fields_for :availabilities do |builder| %>
<%= render partial: 'availabilities/form_mini', locals: {f: builder} %>
<% end %>
我现在唯一的问题是我想将实例变量传递给我的可用性部分。像这样的
<%= render partial: 'availabilities/form_mini', locals: {f: builder, a: availability} %>
应该怎么做?我不确定如何在渲染所有部分时迭代所有 @availabilities。
【问题讨论】:
标签: ruby-on-rails-4 activerecord nested-forms