Я пытаюсь использовать драгоценный камень кокона для создания вложенных форм.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
ошибка заявляет вас где вы ссылаетесь на 'tenor_id' для объекта' Tenor'. Мы не видим достаточно кода, чтобы узнать, где это. У вашего тенор должен быть bips_id, но поскольку у вас есть 'has_one', не должно быть' tenor_id' вообще? – nathanvda
Не уверен, что вы имеете в виду. Тенор является полиморфным, он будет содержать идентификатор бипов. Я не понимаю этого предложения. Вы имеете в виду, что у конечного родителя (organisation.rb) также должна быть ассоциация с Tenor? – Mel
Я имею в виду: ошибка говорит, что где-то вы пытаетесь назначить идентификатор тенора, так что, где в вашем коде/форме это может быть? Можете ли вы показать нам, что отправлено на контроллер? – nathanvda