2009-12-17 10 views
5

Mam pole wyboru, w którym przy zmianie muszę pobrać wartość, a za pomocą funkcji zdalnej pobrać nazwy pól z bazy danych, a następnie wygenerować te pola w dalszej części formularza, wybierając opcję, z której wybrano pole wyboru.przekazać formularz budowniczy w remote_function w szynach?

Problem polega na tym, że pola są w pliku f.form_for, więc używają formbuildera f, który ma pole wyboru w. Więc kiedy renderuję częściowe poprzez ajax w kontrolerze pojawia się błąd, ponieważ nie mam odwołanie do lokalnego kreatora formularzy f.

czy ktoś wie, w jaki sposób lub czy mogę uzyskać odwołanie do konstruktora formularza, czy można go przekazać w zdalnym wywołaniu funkcji, a następnie przekazać do moich mieszkańców w częściowym?

dziękuję, każda pomoc będzie świetna, tak jak to było przez długi czas!

okrzyki Rick

Odpowiedz

7

Chciałbym po prostu przepisać częściowe nie używać f. tworzą pomocników.

Do:

<%= text_field :object_name, :method_name %> 

Zamiast:

<%= f.text_field :method_name %> 
+0

Odpowiedź na moje pytanie tutaj: http://stackoverflow.com/questions/8821613/rails-lookup-table-with-dynamic-nested-forms – Karl

+0

Hej Karl, Brakuje pytania, z którym się łączysz. Czy pamiętasz, co to było? Mam dokładnie ten sam problem. Dzięki! –

18

miałem ten sam problem i moje rozwiązanie było stworzenie innego generatora formularzy dla tego samego obiektu i przekazać je do podszablonów.

remote_action.js.erb:

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

Istotne jest, aby znacznik form_for posiada apostrofów albo nie będzie javascript_escape problemy.

+0

Świetnie, działa. Brakowało nawiasów zamykających w częściowym renderowaniu i musiałem usunąć znak "/" w wierszu pierwszym. –

+0

To zadziałało dla mnie, gdy zdałem sobie sprawę, że przez "@ Object" odnosisz się do pewnej zmiennej instancji w twoim kontrolerze (tej, która jest wywoływana dla AJAX) ... która w moim przypadku była @property (etc ...) Mój wyglądał jak to: vcavanna

+0

Hej, przepraszam, jeśli nie będę wystarczająco jasny ... –

0

Ten fragment nie pasował dobrze w komentarzach do innej odpowiedzi ... pomaga zilustrować przypadek, w którym częściowa jest dla modelu zagnieżdżonego i jest przywoływana w zdalnej metodzie/akcji. Ilustruje on również, że moja wykładnia literalna @object była błędna:

'<%= 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 %>'

uwaga, że ​​jest to @property, zagnieżdżone pod @ property.agency: gdzie mamy fields_for zagnieżdżony pod form_for.

2

robię coś podobnego do tego, co sugeruje Uri Klar, ale bez przechodzenia elementów formularza jako ciągi z powrotem do klienta, ponieważ nie są one potrzebne:

# 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 %>'); 

Uwaga, form_helper = nil na pierwszej linii jest tam, aby ustawić zakres zmiennej poza blokiem formularza.

Myślę, że jest to lepsze podejście, ponieważ nie naraża klienta na żadne z naszych wewnętrznych działań, ale raczej utrzymuje je wyłącznie po stronie serwera.