Cocoon has_many полиморфная ассоциация не отправляет значения формы в параметрах
У меня странная проблема с Cocoon gem
всякий раз, когда я добавляю новые поля Cocoon, эти поля не отправляются в хэше params.
Обычные поля, которые не построены из кокона, работают как положено. Вот соответствующий код.
class Standard < ActiveRecord::Base
has_many :spaces, as: :space_sourceable
accepts_nested_attributes_for :spaces, :reject_if => :all_blank, :allow_destroy => true
end
class Space < ActiveRecord::Base
belongs_to :space_sourceable, polymorphic: true
end
class ContractsController < ApplicationController
def create
set_resource(resource_class.new resource_params)
if get_resource.save
redirect_to authenticated_root_url, notice: "Contract successfully created."
else
render "new"
end
end
def new
set_resource(resource_class.new)
build_nested_resources
end
private
def build_nested_resources
resource.spaces.build
end
def get_resource
instance_variable_get("@#{resource_name}")
end
def set_resource(resource = nil)
resource ||= resource_class.find_by_id params[:id]
instance_variable_set("@#{resource_name}", resource)
failure unless resource
end
def resource_name
@resource_name ||= self.controller_name.singularize
end
def resource_class
@resource_class ||= resource_name.classify.constantize
end
def resource_params
params.require(resource_name.to_sym).permit(:id, :name, :note, spaces_attributes: [:id, :unit, :building, :floor, :amendment_type, :area, :space_sourceable_type, :space_sourceable_id, :_destroy]
end
end
class StandardsController < ContractsController
end
#_form.html.haml
= form_for resource do |f|
- if resource.errors.any?
#error_explanation
%h2
= pluralize(resource.errors.count, "error")
prohibited this lease information from being saved:
%ul
- resource.errors.full_messages.each do |msg|
%li= msg
.field
%strong.upper Name:
= f.text_field :name, class: "input", style: "width: 450px;", required: true
%h3.center-heading Space
= render partial: "spaces", locals: {f: f}
#_spaces.html.haml
= f.fields_for :spaces do |space|
= render "space_fields", f: space
.links
= link_to_add_association 'Add Space', f, :spaces, partial: "space_fields"
#_space_fields.html.haml
.nested-fields
.field
.upper Unit
= f.text_field :unit, class: "input", style: "width: 450px;"
.field
.upper Building
= f.text_field :building, class: "input", style: "width: 450px;"
.field
.upper Floor
= f.text_field :floor, class: "input", style: "width: 450px;"
.field
.upper Area
= f.text_field :area, class: "input", style: "width: 450px;"
.field
.upper Amendment Type
= f.text_field :amendment_type, class: "input", style: "width: 450px;"
= link_to_remove_association "Remove this Space", f
HTML, сгенерированный Cocoon и обычные поля формы, также выглядит хорошо
#normal field from form
<input type="text" id="standard_spaces_attributes_0_unit" name="standard[spaces_attributes][0][unit]" class="input">
#field generated by cocoon
<input type="text" id="standard_spaces_attributes_1436417485840_unit" name="standard[spaces_attributes][1436417485840][unit]" class="input">
Это отправляет следующие параметры на сервер
{"standard"=>{"name"=>"fdfdfd", "spaces_attributes"=>{"0"=>{"unit"=>"asds", "building"=>"", "floor"=>"", "area"=>"", "amendment_type"=>""}}, "note"=>""}, "commit"=>"Create Standard", "utf8"=>"✓", "authenticity_token"=>"MYAn/MTgEOpS5B0xubsmMEW53EbOSPkgvJ/1sWTJAVcIf8cZLMNI6O1Py3qBho4Kkgteq5smJyYBNH1GT26Bqw==", "controller"=>"standards", "action"=>"create"}
PS set_resource и get_resource или любые другие универсальные методы работают должным образом, так как я могу сохранять значения при нормальных обстоятельствах. Я также могу добавлять и удалять поля по кокону, просто эти поля не отправляются вместе с другими атрибутами формы. Это также не проблема с сильными параметрами, потому что значения будут внесены в белый список, только если они действительно присутствуют в хэше params.