1

Я пытаюсь использовать драгоценный камень кокона для создания вложенных форм.Rails 5, Cocoon Gem - вложенная форма внутри вложенной формы

У меня есть модели для организации, пакета :: Bip и Tenor.

В ассоциации являются:

Организация

has_many :bips, as: :ipable, class_name: Package::Bip 
    accepts_nested_attributes_for :bips, reject_if: :all_blank, allow_destroy: true 

Пакет :: Бип (полиморфный)

belongs_to :ipable, :polymorphic => true, optional: true, inverse_of: :bip 

    has_one :tenor, as: :tenor 
    accepts_nested_attributes_for :tenor, reject_if: :all_blank, allow_destroy: true 

Тенор (полиморфный)

belongs_to :tenorable, :polymorphic => true, optional: true 

В формы имеет:

В моих организациях/_form.html.erb, у меня есть:

<%= f.simple_fields_for :bips do |f| %> 
     <%= f.error_notification %> 
     <%= render 'package/bips/bip_fields', f: f %> 

    <% end %> 

    <%= link_to_add_association 'Add another intellectual property resource', f, :bips, partial: 'package/bips/bip_fields' %> 

В моей bip_fields.html.erb вложенных форм, у меня есть:

<%# if @package_bips.tenor.blank? %> 
    <%= link_to_add_association 'Add timing', f, :tenor, partial: 'tenors/tenor_fields' %> 
<%# end %> 

<%= f.simple_fields_for :tenor do |tenor_form| %> 
    <%= f.error_notification %> 
    <%= render 'tenors/tenor_fields', f: tenor_form %> 
<% end %> 

Javascript

В документах по кокону предлагается добавить файл js для указания ассоциации-вставки в качестве функции. В моем tenor_subform.js у меня есть:

$(document).ready(function() { 
    $(".add_tenor a"). 
     data("association-insertion-method", 'append'). 
     data("association-insertion-node", function(link){ 
     return link.closest('.row').next('.row').find('.tenor_form') 
     }); 
}); 

Контроллеры

В моем контроллере организации, у меня есть:

def new 
    @organisation = Organisation.new 
    @organisation.bips 
end 

Примечание: Я не уверен, что мне нужно добавьте еще одну строку в мое новое действие, чтобы создать экземпляр organisation.bip.tenor. Я также не уверен, что im должен добавить has_one через ассоциацию на organisation.rb, которая ссылается на тенор.

def organisation_params 
     params.fetch(:organisation, {}).permit(:title, :comment, 

      bips_attributes:   [:id, :status, :_destroy, 
      tenor_attributes:   [:id,:commencement, :expiry,      :_destroy] 

     ], 

В мой контроллер тенор, у меня есть:

def tenor_params 
     params.require(:tenor).permit(:commencement, :expiry) 
    end 

ОШИБКИ

Я не уверен, если мне нужно добавить тенора действия в контроллер организации (материнской компании BIP который, в свою очередь, является родителем тенор).

Когда я сохраняю все это и попробовать его, я получаю сообщение об ошибке, которое говорит:

unknown attribute 'tenor_id' for Tenor. 

Когда я вижу другие SO сообщения с этой ошибкой, его часто, потому что: атрибут ID не белый список в родительском классе. Я сделал это.

Может ли кто-нибудь увидеть, что я сделал неправильно?

контроллер Тенор

class TenorsController < ApplicationController 

    before_action :set_tenor, only: [:show, :edit, :update, :destroy] 
    before_action :authenticate_user! 
    # after_action :verify_authorized 

    def index 
    @tenors = Tenor.all 
    # authorize @tenors 
    end 

    def show 

    end 

    def new 
    @tenor = Tenor.new 
    # authorize @tenor 
    end 

    def edit 

    end 

    def create 
    @tenor = Tenor.new(tenor_params) 
    # authorize @tenor 

    respond_to do |format| 
     if @tenor.save 
     format.html { redirect_to @tenor } 
     format.json { render :show, status: :created, location: @tenor } 
     else 
     format.html { render :new } 
     format.json { render json: @tenor.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    respond_to do |format| 
     if @tenor.update(tenor_params) 
     format.html { redirect_to @tenor } 
     format.json { render :show, status: :ok, location: @tenor } 
     else 
     format.html { render :edit } 
     format.json { render json: @tenor.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @tenor.destroy 
    respond_to do |format| 
     format.html { redirect_to action: :index } 
     format.json { head :no_content } 
    end 
    end 

    private 
    def set_tenor 
     @tenor = Tenor.find(params[:id]) 
     # authorize @tenor 
    end 

    def tenor_params 
     params.require(:tenor).permit(:express_interest, :commencement, :expiry, :enduring, :repeat, :frequency) 
    end 

end 
+0

ошибка заявляет вас где вы ссылаетесь на 'tenor_id' для объекта' Tenor'. Мы не видим достаточно кода, чтобы узнать, где это. У вашего тенор должен быть bips_id, но поскольку у вас есть 'has_one', не должно быть' tenor_id' вообще? – nathanvda

+0

Не уверен, что вы имеете в виду. Тенор является полиморфным, он будет содержать идентификатор бипов. Я не понимаю этого предложения. Вы имеете в виду, что у конечного родителя (organisation.rb) также должна быть ассоциация с Tenor? – Mel

+0

Я имею в виду: ошибка говорит, что где-то вы пытаетесь назначить идентификатор тенора, так что, где в вашем коде/форме это может быть? Можете ли вы показать нам, что отправлено на контроллер? – nathanvda

ответ

1

Вы has_one отношение неясно объявлен. Потому что вы говорите, что as: :tenor заставляет его искать tenor_id.

Вы должны объявить его следующим образом:

has_one :tenor, as: :tenorable 
+0

ahh - конечно. спасибо – Mel

0

Ваша модель не видит идентификатор nested_attr.Add :inverse_of => #{model}.

Пример:

class Tenor < ActiveRecord::Base 
    has_many :traps, :inverse_of => :bips 
end 

Для получения дополнительной информации смотрите this или this документацию.

+0

Но tenor.rb является полиморфным, он имеет: принадлежит_to: tenorable,: polymorphic => true, optional: true – Mel