У меня есть модель структуры следующим образом:рельсы не инициализируется несохраненные вложенные модели
class Client
belongs_to :lead
accepts_nested_attributes_for :lead
end
class Lead
has_one :client
has_many :defense_practices, through: :some_join_model, source: :practice, source_type: "DefensePractice"
accepts_nested_attributes_for :defense_practices
end
У меня есть форма структура имеет следующие:
<%= form_for @client do |f| %>
<%= f.fields_for :leads do |lead_builder|
<%= f.fields_for defense_practices do |practice_builder|
<%= practice_builder.text_field :some_field %>
<% end %>
<% end %>
<% end %>
Данные корректно представлены в Params хэша:
Parameters: {
"client"=>{
"lead_attributes"=>
{"id"=>"45",
"defense_practices_attributes"=>
{"0"=>{
"some_field"=>"some_value",
"id"=>"52"
},
"4"=>{
"some_field"=>"some_value"
}
}
}
}
}
Вторая практика была добавлена через javascript, используя ту же технику, что и в railscasts n образная модель.
Когда модели инициализируются в действие создания, оборонной практики, которая была добавлена с помощью JavaScript (который несохраненные, как показано отсутствие атрибута ид в приведенном выше хэш) не инициализирован:
def create
@client = Client.new client_profile_params
puts @client.lead.defense_practices.size # => 1
end
def client_profile_params
params[:client].permit!
end
Особое примечание. В модели клиента мне пришлось переопределить lead_attributes =, потому что у меня есть несохраненная модель клиента с сохраненной моделью, и если я не переопределяю, тогда рельсы жалуются: не удалось найти Lead с ID = 46 для клиента с ID =.
def lead_attributes=(params)
if params[:id].present?
lead = Lead.find(params[:id])
self.lead = lead
else
super
end
end
Он должен инициализировать две практики защиты. Но он только инициализировал практику защиты, которая уже была связана с этим руководством. Это не добавило новую практику защиты в ассоциацию. Что я делаю не так?
Можем ли мы увидеть ваши 'client_profile_params'? – JTG
def client_profile_params params [: client] .permit! конец @JTG – Donato