передать построитель форм в remote_function в рельсах?

У меня есть поле выбора, в котором при изменении мне нужно получить значение и с помощью удаленной функции получить некоторые имена полей из БД, а затем сгенерировать эти поля дальше вниз по форме, зависящей от того, какая опция выбрана из поля выбора.

Проблема в том, что поля находятся в f.form_for, поэтому они используют конструктор форм f, в котором есть поле выбора. Поэтому, когда я отображаю частичное через ajax в контроллере, я получаю сообщение об ошибке, поскольку у меня нет ссылки на локальный конструктор форм f.

кто-нибудь знает, как или если я могу получить ссылку на построитель форм, или если я могу передать его в удаленном вызове функции, а затем передать в моих местных жителей в частичном?

Большое спасибо, любая помощь будет отличной, так как застрял на этом долгое время!

ура Рик


person richard moss    schedule 17.12.2009    source источник
comment
ДОНАТО: Ответ, отмеченный 20 баллами, не работает для вложенных форм, и я не могу удалить свой голос, поэтому оставляю здесь комментарий для дальнейшего использования.   -  person Donato    schedule 19.05.2018
comment
Тот, на который ответили 17 декабря 2009 года, является лучшим ответом.   -  person Donato    schedule 19.05.2018


Ответы (4)


У меня была та же проблема, и мое решение состояло в том, чтобы создать еще один конструктор форм для того же объекта и передать его частичным элементам.

remote_action.js.erb:

'<%= form_for(@object) do |ff| %>'
   $('#some_div').html("<%= j render(partial: 'some_partial', locals: {f: ff}) %>"
'<% end %>' 

Важно, чтобы тег form_for был заключен в одинарные кавычки, иначе будут проблемы с javascript_escape.

person Uri Klar    schedule 11.11.2013
comment
Отлично, работает. В частичном рендеринге отсутствовали закрывающие скобки, и мне пришлось удалить / в первой строке. - person Mark Kenny; 18.03.2014
comment
Это сработало для меня, как только я понял, что с помощью @object вы ссылаетесь на некоторую переменную экземпляра в вашем контроллере (тот, который вызывается для AJAX)... который в моем случае был @property (и т. д...) Мой выглядел так: ‹ РЕДАКТИРОВАТЬ удалил беспорядок, созданный вставкой моего кода... и поместив его в сообщение с ответом › - person vcavanna; 10.07.2014
comment
Привет Ури, у меня была похожая проблема. Единственная разница в том, что я работаю с вложенными полями и использую fields_for вместо form_for. Поэтому мне нужно сделать что-то вроде f.fields_for:accessories, где f — объект form_builder для модели автомобиля. Ассоциация похожа на то, что у этого транспортного средства есть_много аксессуаров. Пожалуйста, помогите в этом случае. Заранее спасибо. - person cvibha; 19.08.2015
comment
Действительно умный способ динамического рендеринга полей формы через JS. Спасибо за совет. Работает отлично. - person Goldnuggets; 09.05.2016
comment
Я проголосовал за ответ, но после того, как попробовал его для вложенных форм, он вообще не работает. - person Donato; 19.05.2018

Я бы просто переписал ваш частичный код, чтобы не использовать f. сформировать помощников.

Do:

<%= text_field :object_name, :method_name %>

Вместо:

<%= f.text_field :method_name %>
person MattMcKnight    schedule 17.12.2009
comment
Это ответило на мой вопрос здесь: stackoverflow .com/questions/8821613/ - person Karl; 12.01.2012
comment
Эй, Карл! Вопрос, на который вы ссылались, отсутствует. Вы можете вспомнить, что это было? У меня точно такая же проблема. Спасибо! - person Uri Klar; 11.11.2013

Я делаю что-то похожее на то, что предложил Ури Клар, но без передачи элементов формы в виде строк обратно клиенту, поскольку они не нужны:

# create a form helper 'f' and store it in the variable form_helper.

<% form_helper = nil %> 
<% form_for @object, url: '' do |f| %>
<%   form_helper = f %>
<% end %>

# pass form_helper to the form partial

$('#element').html('<%= j render "form_element", f: form_helper %>');

Обратите внимание, что form_helper = nil в первой строке указывает, что область действия переменной выходит за рамки блока формы.

Я думаю, что это лучший подход, потому что он не подвергает клиента какой-либо нашей внутренней работе, а скорее держит его исключительно на стороне сервера.

person Oded Davidov    schedule 15.09.2016

Этот фрагмент не очень хорошо вписывается в комментарии к другому ответу... он помогает проиллюстрировать случай, когда партиал относится к вложенной модели и упоминается в удаленном методе/действии. Это также показывает, что моя буквальная интерпретация @object была неверной:

'<%= form_for([@property.agency,@property]) do |parent_form| %> ' '<%= parent_form.fields_for :address do |f| %>' $('#property_addresses').append("<%= j render(partial: 'common_partials/address', locals: {parent_form: f}) %>") '<% end %>' '<% end %>'

Обратите внимание, что это @property, вложенное в @property.agency: где у нас есть fields_for, вложенное в form_for.

person vcavanna    schedule 10.07.2014