【问题标题】:Nested attributes showing when editing but not when creating a new record in rails嵌套属性在编辑时显示,但在 Rails 中创建新记录时不显示
【发布时间】: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 availabilitiesJobSpecsController 的新动作现在看起来像这样

  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


    【解决方案1】:

    很高兴您解决了一些问题。第一个小改进

    #job_specs_controller.rb
    
    def new
      @job_spec = JobSpec.new(client_id: params[:client_id])
      @job_spec.availabilities.build
    end
    

    为了克服您的上一个问题,解决方案是您之前和之后的混合。您可以在fields_for 方法中传递实际对象。是这样的:

    #_form.html.erb
    <% @job_spec.availabilities.each do |availability| %>
      <%= f.fields_for :availabilities, availability do |builder| %>
        <%= render partial: 'availabilities/form_mini',
            locals: {f: builder, a: availability} %>
      <% end %>
    <% end %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-22
      • 2016-12-21
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2011-01-20
      相关资源
      最近更新 更多