В общем, так и не поняв как мне эту
f
передать в этот партиал (насколько я могу судить её и не передать), я решил пойти путём воссоздания этого партиала «руками».
Во-первых, я создал отдельный партиал для ajax-вставки (я даю сразу результат, ниже поясняю откуда в нём появились переменная
@building
и хелпер
building_nested_model_count
):
views/admin/buildings/_form_building_views_ajax.html.haml.form-element-container
.form-element.b-form-labels= image_tag(@building_view.image_url(:thumb)) if @building_view
.form-element.b-form-fields= text_field_tag "building[building_views_attributes][#{building_nested_model_count(@building_view, @building)}][title]", nil, placeholder: 'Title'
= hidden_field_tag "building[building_views_attributes][#{building_nested_model_count(@building_view, @building)}][id]", @building_view.id
В нём я просто воссоздал форму, которую мне нужно добавить через ajax (rails с помощью хелперов её генерит автоматом, а я сгенерил её руками). Для того, чтобы оно заработало мне нужно внести изменения в три файла:
1. Определяем переменную
@building
controllers/admin/building_views_controller.rbclass Admin::BuildingViewsController < ApplicationController
def create
@building_view = BuildingView.create(building_view_params)
@building = @building_view.building # определяем @building
end
private
def building_view_params
params.require(:building_view).permit(:building_id, :image)
end
end
2. Для хэша
params
в полях
id
и
name
формы присутствует индекс для каждого BuildingView (см. в ajax-партиал), рассчитаем его с помощью хелпера:
helpers/admin/building_views_helper.rbmodule Admin::BuildingsHelper
def building_nested_model_count(nested_var, building)
nested_class = nested_var.class
nested_class.where(building_id: building.id).count
end
end
3. И наконец изменим партиал для рендера:
views/admin/building_views/create.js.haml- if @building_view.new_record?
== alert('Oops!');
- else
== $('#building_views').append('#{j render('admin/buildings/form_building_views_ajax')}');
Я в силу небольшого опыта не понимаю: костыль это или решение задачи (с удовольствием послушаю мнения). Но оно работает: форма для нового BuildingView рендерится, его отредактированный
title
сохраняется.