2008-12-16 15 views
14

Tak Mam formularz w mojej aplikacji Rails który używa niestandardowego FormBuilder dać mi niektóre znaczniki niestandardowe poleRails AJAX: Moi częściowe potrzebuje instancja FormBuilder

<% form_for :staff_member, @staff_member, :builder => MyFormBuilder do |f| %> 
[...] 
    <%= render :partial => "staff_members/forms/personal_details", :locals => {:f => f, :skill_groups => @skill_groups, :staff_member => @staff_member} %> 
[...] 
<% end %> 

Teraz, to częściowy jest w obszarze formularza, który zostaje zastąpiony przez wywołanie zwrotne AJAX. Co ja w końcu robi z kontrolera w odpowiedzi na żądania AJAX jest:

render :partial => "staff_members/forms/personal_details", :locals => {:skill_groups => @skill_groups, :staff_member => @staff_member} 

Jeśli jednak to zrobić wtedy przerwy forma, jako przedmiot FormBuilder użyłem w form_for nie jest już dostępny. Czy jest jakiś sposób, aby użyć mojego niestandardowego obiektu FormBuilder wewnątrz częściowego używanego do wywołania zwrotnego AJAX?

+0

Mam ten sam problem z regularnym konstruktorem formularzy, czy nadal będę używać pól? – Joelio

Odpowiedz

14

Użyj fields_for wewnątrz częściowego. Wykonuje podobne zadanie, ale bez zawijania znaczników formularza. Zobacz API docs.

+0

Cześć, to właśnie skończyłem robiąc w końcu :) To trochę niezręczne, ale w rzeczywistości czuje się ładniej przechodzące obiekty niż konstruktory formularzy – Gareth

+29

Ale co robisz w sytuacji, w której faktycznie potrzebujesz tego kreatora formularzy? na przykład kiedy wywołujesz zagnieżdżone pola (f.fields_for)? –

+5

Czy było kiedykolwiek jakieś rozwiązanie? @AndrewVit Wciąż jestem uwięziony w tej sprawie 5 lat po twoim komentarzu. – Donato

1

Można instancji nową instancję formularza Konstruktor w sterowniku, chociaż czuje się jakby kiepski do mnie:

# in the controller 
render :partial => { 
    :f => MyFormBuilder.new(:staff_member, @staff_member, template), 
    :skill_groups => @skill_groups, 
    :staff_member => @staff_member 
} 

Alternatywnie, można przenieść więcej logiki aktualizacji być po stronie klienta, który wouldn Nie musisz martwić się renderowaniem czegokolwiek. Możesz po prostu zaktualizować wartości przez JS. Nie jestem pewien, czy to działa dla twojego projektu.

2

co z tym?

@template.with_output_buffer do 
    @template.form_for @model_object do |f| 
     f.fields_for :some_nested_attributes do |ff| 
     render :partial => 'nested_attributes', :object => @model_object, :locals => {:form => ff} 
     end 
    end 
    end 

ten byłby szczególnie przydatny jest trzeba użyć zagnieżdżony fields_for w częściowym

+0

Przepraszam za ten stary post, ale co z plikiem js.erb? czy nie ma tam problemów? Czy twój kod odnosi się do pliku html.erb lub js.erb? –

1

Może jestem trochę późno w grze tutaj, a może nie rozumiem pytanie poprawnie, ale w ApplicationHelper.rb myślę, że można po prostu dodać linię:

ActionView::Base.default_form_builder = MyFormBuilder 
Powiązane problemy