Tratando de extender a ActionView::Ayudantes::FormBuilder
-
21-09-2019 - |
Pregunta
Estoy tratando de SECAR el código moviendo cierta lógica en el FormBuilder.Después de la lectura de la documentación acerca de cómo seleccionar y forma alternativa generador de la solución lógica para mí parecía ser algo como esto.
En la vista
<% form_for @event, :builder => TestFormBuilder do |f| %>
<%= f.test %>
<%= f.submit 'Update' %>
<% end %>
y luego en app/helpers/application_helper.rb
module ApplicationHelper
class TestFormBuilder < ActionView::Helpers::FormBuilder
def test
puts 'apa'
end
end
end
Esto, sin embargo, me da un error en el "form_for"
uninitialized constant ActionView::Base::CompiledTemplates::TestFormBuilder
Donde estoy haciendo mal?
Solución
tratar con:
form_for @event, :builder => ApplicationHelper::TestFormBuilder do |f|
Otros consejos
El generador de clase se puede colocar en el archivo de módulo, dentro y / o fuera de definición de módulo, de esta manera:
# app/helpers/events_helper.rb
module EventsHelper
...
class FormBuilderIn < ActionView::Helpers::FormBuilder
...
end
end
class FormBuilderOut < ActionView::Helpers::FormBuilder
...
end
Forma adecuada para unir constructor para formar es:
# app/views/events/_form_in.html.erb
form_for @event, :builder => EventsHelper::FormBuilderIn do |f|
# app/views/events/_form_out.html.erb
form_for @event, :builder => FormBuilderOut do |f|
Aquí es método de ayuda para configurar la opción de constructor en forma:
# app/helpers/events_helper.rb
module EventsHelper
def form_in_for(data, *args, &proc)
options = args.extract_options!
form_for(data, *(args << options.merge(:builder => EventsHelper::FormBuilderIn)), &proc)
end
def form_out_for(data, *args, &proc)
options = args.extract_options!
form_for(data, *(args << options.merge(:builder => FormBuilderOut)), &proc)
end
end
...
Ahora, no hay manera opcional para conectar constructor para formar:
# app/views/events/_form_in.html.erb
form_in_for @event do |f|
# app/views/events/_form_out.html.erb
form_out_for @event do |f|
Por último, los constructores personalizados se pueden colocar en carpeta separada, por ejemplo "app / constructores", pero esto exige para añadir manualmente este camino en el entorno de aplicación. Para rieles 2.3.x, establezca:
# config/environment.rb.
config.load_paths += %W( #{RAILS_ROOT}/app/builders )
Como se puede ver en http://guides.rubyonrails.org/configuring .html # configuración de acción- vista, se puede establecer un valor predeterminado FormBuilder -class para toda la aplicación. En su caso:
config.action_view.default_form_builder = "ApplicationHelper::TestFormBuilder"