Я делаю сложную и тяжелую форму в своем приложении. Итак, чтобы повысить производительность, я хотел бы внедрить некоторую часть этой формы с помощью метода AJAX. Но я не могу этого добиться.
Чтобы проиллюстрировать это, я сделал этот простой пример =
new_event (просмотр):
<%= simple_form_for event, remote: true do |f| %>
<%= f.input_field :start_at %>
<div class = "">
</div>
<a href = "/event_add_user?form=<%=f%>" class = "btn" data-method = "patch" data-remote = "true">
Add user to event
</a>
<div class = "form_area"></div>
<% end %>
event_controller (контроллер):
def add_user
@form = params[:form]
respond_to do |format|
format.js {render 'add_user'}
end
end
add_user.js.erb (файл js):
$('#event_form_area').append('<%= j render partial: "events/user", locals: {f: @form} %>');
пользователь (частично):
<%= f.input_field :user_name %>
В настоящее время у меня такая ошибка:
ActionView::Template::Error (undefined method `input' for "":String)





вы пытаетесь передать конструктор форм f через params, что я не думаю, что это возможно.
Поскольку f.input_field - это просто вспомогательный метод для вывода некоторого HTML, идея состояла бы в том, чтобы напрямую реализовать этот HTML в партиале.
Итак, партиал «события / пользователь» будет:
<input class = "string required" id = "event_user" maxlength = "100" name = "event[user]" type = "text" value = "" />
если это сработает, вы можете удалить @form = params[:form] из контроллера, хэш locals из представления и ?form=<%=f%> из вызова AJAX, поскольку они больше не нужны.
Вы также можете использовать помощники form_tag:
<%= text_field_tag(:event,:user) %>
Thnaks @Getu, это именно то, что я ищу. Хорошее продолжение !!
Вы передаете @form как f в частичном представлении. Скорее всего, params[:form] - это строка. Вот несколько способов решения этой проблемы.
1. Восстановите объект формы.
Поскольку у вас нет объекта f из вашего предыдущего запроса, вы можете воссоздать его, чтобы сгенерировать фрагмент html. Вместо получения объекта формы из params, что я считаю невозможным, вы можете создать новый объект формы, используя новый объект Event. Я не тестировал это на рельсах, но это должно дать вам представление.
def add_user
@event = Event.new
respond_to do |format|
format.js {render 'add_user'}
end
end
Установить @user как местные
$('#event_form_area').append('<%= j render partial: "events/user", locals: {event: @event} %>');
Затем воссоздайте объект формы
# partial
<% form_for event do |f| %>
<%= f.input_field :user_name %>
<% end %>
Обратите внимание на использование <% вместо <%= в первой строке. Мы не хотим иметь еще один элемент <form>.
Тогда все готово. Этот код должен генерировать фрагменты HTML.
или 2. Используйте простой HTML
В вашем частичном случае перепишите свой код в простой элемент html. Например
<input class = "form-control" type = "text" name = "event[user_name]" id = "event_user_name">
href = "/event_add_user?form=<%= event%>"можете ли вы протестировать его со следующими изменениями. =?