【问题标题】:Receiving undefined method `reflect_on_association' for NilClass:Class Cocoon Rails 6接收 NilClass:Class Cocoon Rails 6 的未定义方法“reflect_on_association”
【发布时间】:2019-11-12 02:57:00
【问题描述】:

我目前正在使用双嵌套部分将子记录添加到深度嵌套的表单中。表单输入显示,但 link_to_add_association 按钮引发异常。如何使用我的 link_to_add_association 按钮访问子表单输入?

providers_controller.rb

class ProviderContractsController < ApplicationController
  before_action :set_provider_contract, only: %i[show edit update destroy]

def new
    @provider_contract = ProviderForm.find(params[:provider_form_id])
    @provider_contract = ProviderContract.new(provider_form_id: @provider.id)
    @provider_contract.build_contract_term
    @provider_contract.contract_term.contract_term_fees.build


  rescue ActiveRecord::RecordNotFound
    redirect_to home_path, notice: 'The provider has been removed or has not been selected'
  end

  private

  # Use callbacks to share common setup or constraints between actions.
  def set_provider_contract
    @provider_contract = ProviderContract.find(params[:id])
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def provider_contract_params
    params.require(:provider_contract).permit(ProviderContract.attribute_names.map(&:to_sym),

                                              contract_term_attributes: ContractTerm.attribute_names.map(&:to_sym).push( contract_term_fees_attributes: ContractTermFee.attribute_names.map(&:to_sym).push(:id, :_destroy))
  end
end

_form.html.erb

 <%= simple_form_for(@provider_contract, html: { class: "ui form"}) do |f| %>
    <%= f.error_notification %>
    <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>

  <div class="ui tab" data-tab="stage-4">
      <%= f.simple_fields_for :contract_term do |ct| %>
        <%= render 'provider_contracts/partials/contract_term', f: ct %>
      <% end %>
    </div>
<% end %>

_contract_term.html.erb

<div id="#term_fees">
    <%= f.simple_fields_for contract_term_fees do |ff| %>
      <%= render 'provider_contracts/contract_term_fee_fields', f: ff %>
    <% end %>
  </div>
  <div class="pt-2 pb-2 links">
    <%= link_to_add_association f, :contract_term_fees, class: 'ui positive basic button' do %>
      Add Fees
    <% end %>
  </div>

contract_term.rb

class ContractTerm < ApplicationRecord
  belongs_to :provider_contract
  has_many :contract_term_fees, dependent: :destroy


  accepts_nested_attributes_for :contract_term_fees, reject_if: :all_blank, allow_destroy: true
end

服务器日志

ActionView::Template::Error (undefined method `reflect_on_association' for NilClass:Class):
    62:     <% end %>
    63:   </div>
    64:   <div class="pt-2 links">
    65:     <%= link_to_add_association  f, :contract_term_fees, class: 'ui secondary basic button' do %>
    66:       Add Fees
    67:     <% end %>
    68:   </div>

【问题讨论】:

  • 错误显示了一些不在您显示的代码上的代码(错误的第 65 行与您的 contract_term_fees 部分不同)。
  • 对不起,我昨晚累坏了。
  • 我不确定这是否是问题所在,但您在这里缺少: &lt;%= f.simple_fields_for contract_term_fees do |ff| %&gt;:contract_terms_fees

标签: ruby-on-rails ruby cocoon-gem


【解决方案1】:

一般来说,当这个错误发生时,这意味着要么缺少accepts_nested_attributes_for,要么意味着我们在某个地方交了一个 nil 对象。

从您显示的代码中,要么

  • accepts_nested_attributes_for :contract_termsContract 中丢失?
  • f.simple_fields_for contract_term_fees 是一个错字,应该写成f.simple_fields_for :contract_term_feescontract_term_fees 显然是 nil)

注意在 Rails 6 中和在 Rails 5 中一样,您还必须声明关系的 inverse_of: 以确保嵌套关系将正确保存(因为默认情况下需要 belongs_to,并且没有 @987654329 @rails 无法知道它是提供的)。

所以

  belongs_to :provider_contract, inverse_of: :contract_terms  

【讨论】:

  • 提供者表单ID没有被保存..我只是把它放在一个隐藏字段中
  • 谢谢! - 从现在开始我将使用 inverse_of
猜你喜欢
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
相关资源
最近更新 更多