Rails AJAX: I miei bisogni parziali un'istanza FormBuilder
-
21-08-2019 - |
Domanda
Così ho una forma nella mia applicazione Rails che usa un FormBuilder personalizzato per darmi alcuni tag campi personalizzati
<% 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 %>
Ora, questa parziale è in una zona della forma che si sostituisce con un callback AJAX. Quello che finisce per fare dal controller in risposta alla richiesta AJAX è:
render :partial => "staff_members/forms/personal_details", :locals => {:skill_groups => @skill_groups, :staff_member => @staff_member}
Tuttavia, se lo faccio poi le pause di forma, come l'oggetto FormBuilder ho usato in form_for non è più disponibile. C'è un modo per me di utilizzare mia abitudine FormBuilder oggetto all'interno di un usato parziale per un callback AJAX?
Soluzione
Utilizzare fields_for
all'interno del vostro parziale. Esso svolge un compito simile, ma senza avvolgendo i tag form. Vedere l'API docs .
Altri suggerimenti
come su questo?
@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
questo sarebbe particolarmente utile è necessario utilizzare il fields_for nidificato nel parziale
Si potrebbe istanziare una nuova istanza del costruttore modulo nel controllore, se ci si sente sorta di schifo a me:
# in the controller
render :partial => {
:f => MyFormBuilder.new(:staff_member, @staff_member, template),
:skill_groups => @skill_groups,
:staff_member => @staff_member
}
In alternativa, è possibile muoversi più della logica di aggiornamento per essere lato client che non si richiederebbe preoccuparsi di rendere nulla. Si potrebbe semplicemente aggiornare i valori tramite JS. Non sono sicuro se funziona per il vostro progetto però.
Forse sono un po 'in ritardo nel gioco qui, e forse io non capisco la domanda correttamente, ma in ApplicationHelper.rb penso che si può semplicemente aggiungere la riga:
ActionView::Base.default_form_builder = MyFormBuilder
È possibile inviare all'interno del vostro ajax chiamare il contenuto del f.object_name (è funziona anche con parziali) e usarlo per rendere i tag definiti nel http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html passarlo come primo argomento.