Использование AJAX для вставки частичной формы - PullRequest
0 голосов
/ 23 октября 2018

Я делаю сложную и тяжелую форму в своем приложении.Поэтому, чтобы повысить производительность, я бы хотел внедрить некоторую часть этой формы методом AJAX.Но я не могу этого добиться.

Чтобы проиллюстрировать это, я сделал этот простой пример =

new_event (view):

<%= 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 (неопределенный метод `input 'for" ": String)

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Вы передаете @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">
0 голосов
/ 23 октября 2018

вы пытаетесь передать весь конструктор форм f через параметры, что я не думаю, что это возможно.

Поскольку 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, поскольку он больше не нужен.

ссылка на поле ввода в rubydoc

Вы можететакже используйте помощников form_tag тоже:

<%= text_field_tag(:event,:user) %>
...