2012-05-31 24 views
11

Agregar una clase para form_for a través de la opción html: {class: "form-horizontal"} anula la clase new_model o edit_model predeterminada. ¿Cómo agrego mi clase mientras mantengo la clase form_helper existente?¿Cómo agrego una clase a un formulario en ruby ​​on rails sin establecer/anular la clase de ayuda predeterminada existente?

quiero:

<form class="edit_model form-horizontal"> o

<form class="new_model form-horizontal">

En lugar de:

<form class="form-horizontal">

Respuesta

0
html: {class: "edit_model form-horizontal"} 
+2

La belleza del generador de formularios es que cambia automáticamente entre las clases edit_model y new_model.Me gustaría una forma elegante de hacerlo sin tener que colocar el objeto dentro de una declaración if que detecte si es un objeto nuevo o no. – Evan

1

Tal vez no es una solución ideal, pero ¿ha pensado en hacerlo con JS/Jquery?

Por ejemplo:

$(document).ready(function(){ 
    $('form.edit_model').addClass('form-horizontal') 
}); 
6

me encontré con exactamente el mismo problema. Con el tiempo, me ocurrió con esta solución

form_for @foo, :html => {:class => "form-horizontal #{controller.action_name}_model_name"} 

Puede ser que sea un poco demasiado tarde para que esto sea de mucha utilidad para usted, pero tal vez alguien más le resultará útil.

0

¿Has probado con el método de fusión? [http://ruby-doc.org/core-1.9.3/Hash.html#method-i-merge] Algo como html = html.merge (new) {| key, value1, value2 | value1 + "" + value2} le permitiría alimentar el nuevo valor en el valor de la clase. [Edición rápida: tenga cuidado de configurar y probar la implementación para que no sobrescriba completamente html)

0

Puede usar el asistente de visualización dom_class(object, prefix = nil) para generar nombres de clase como form_for.

No es muy limpio hacerlo directamente en el formulario, pero incorporarlo a un ayudante puede ser solo el boleto. Por ejemplo:

# app/helpers/application_helper.rb 
def class_for object, *additional_classes 
    additional_classes.unshift dom_class(object, object.persisted? ? 'edit' : 'new') 
end 

# app/views/models/_form.html.erb 
<%= form_for @model, :html => {:class => class_for(@model, 'form-horizontal')} do |f| %> 
    <%# ... %> 
<% end %> 

<form class="new_model form-horizontal" ...> 
1

Definición de clases a través de la opción :html => {:class => '...'} anula cualquier clases añadidas por el constructor por defecto. Sin embargo, puede agregar clases de CSS dentro del bloque sin anular esas clases.

Con el form_for ayudante, el :class será una cadena si no se establece de otra manera. Tenga en cuenta el espacio inicial al agregar.

<%= form_for @model do |f| %> 
    <% f.options[:html][:class] << ' form-horizontal' %> 
    <%# ... %> 
<% end %> 

<form class="edit_model form-horizontal"> 

Si está utilizando el ayudante simple_form_for, options[:html][:class] habrá una matriz, y que no es necesario el espacio inicial extra (aunque no hace daño).

<%= simple_form_for @model do |f| %> 
    <% f.options[:html][:class] << 'form-horizontal' %> 
    <%# ... %> 
<% end %> 

<form class="simple_form edit_model form-horizontal"> 

Si utiliza un símbolo en lugar de un modelo, form_for no establecerá la clase, y options[:html][:class] habrá nil en el bloque. Pero si estás haciendo esto, no tienes un modelo que sea nuevo o que persista de todos modos.

<%= form_for :model do |f| %> 
    <% f.options[:html][:class] << ' form-horizontal' %> 
    <%# ... %> 
<% end %> 

NoMethodError: undefined method `<<' for nil:NilClass 
Cuestiones relacionadas