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?

¿Fue útil?

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"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top