передать конструктор форм в remote_function в рельсах? - PullRequest
8 голосов
/ 17 декабря 2009

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

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

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

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

веселит Рик

Ответы [ 4 ]

25 голосов
/ 11 ноября 2013

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

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.

9 голосов
/ 17 декабря 2009

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

Do:

<%= text_field :object_name, :method_name %>

Вместо:

<%= f.text_field :method_name %>
4 голосов
/ 15 сентября 2016

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

# 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 в первой строке позволяет установить область действия переменной за пределы блока формы.

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

0 голосов
/ 10 июля 2014

Этот фрагмент не уместился в комментариях к другому ответу ... он помогает проиллюстрировать случай, когда частичное для вложенной модели, и на него ссылаются в удаленном методе / действии. Это также показывает, что моя буквальная интерпретация @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.

...