Witam,
mam problem z zapisaniem modelu rodzica z zagnieżdżonym modelem “dziecka”. Validator twierdzi, że nie zna id rodzica, więc nie zapisywany jest ani rodzic, ani dziecko/dzieci.
#<ActiveModel::Errors:0x0000012b903950 @base=#<SerialNumber id: nil, snu: "s12", created_at: nil, updated_at: nil>, @messages={:"setup_items.serial_number_id"=>["nie może być puste"]}>
Próbowałem rozwiązań przedstawionych w zgłoszeniach do rails:
https://github.com/rails/rails/pull/3750
https://github.com/rails/rails/commit/42f1ad68655be08a0ff7e5a261d1ad21d3fc90a5
ale niestety nadal mam problem. Sprawdzałem też różne kombinacje has_one, has_many. Nested attributes bez STI działają poprawnie.
Może ktoś z Was ma jakiś pomysł jak rozwiązać problem?
Przykładowe modele:
[code]class Item < ActiveRecord::Base
belongs_to :serial_number
attr_accessor :item_type
attr_accessible :item_type, :description
def self.new(attributes = {}, options = {}, &block)
item_type = (attributes || {}).delete(:item_type)
if options && options[:as] == :administrator && item_type.present?
item_class = "#{item_type.to_s.camelize}Item".constantize
item_class.new(attributes, options, &block)
else
super
end
end
end
class SetupItem < Item
end
class SerialNumber < ActiveRecord::Base
has_many :items
has_many :setup_items, class_name: “SetupItem”
accepts_nested_attributes_for :setup_items
attr_accessible :snu, :setup_items_attributes
end[/code]
Przykładowy kontroler:
[code]class SerialNumbersController < ApplicationController
def new
@serial_number = SerialNumber.new(snu: params[:serial_number][:snu], device_id: params[:serial_number][:device_id])
setup_item = @serial_number.setup_items.new({item_type: ‘Setup’}, as: :administrator)
end
def create
@serial_number = SerialNumber.new(params[:serial_number])
@serial_number.save!
end
end[/code]
Przykładowy widok:
[code]<%= form_for(@serial_number, validate: true, html: { class: “default-form” }) do |f| %>
<%= f.fields_for(:setup_items, validate: false) do |i| %>
<%= i.label :description, t(‘Description’) %>*
<%= i.text_area :description %>
<% end %>
<%= f.hidden_field(:snu, value: @serial_number.snu ) %>