2009-09-04 20 views
17

Probablemente me falta algo obvio aquí, pero esto es lo que estoy tratando de hacer.Rieles ver ayudantes en el archivo de ayuda

Desde el punto de vista, yo estoy llamando una función de ayuda personalizada

<div> 
    <%=display_services%> 
</div> 

En el archivo de ayuda con los display_services funcionan

def display_services 
    html = "<div>" 
    form_for @user do |f| 
    f.text_field ... 
    end 
html << "</div>" 
end 

Me parece que el método form_for y la salida directamente a f.text_field Flujo HTML sin el envoltorio div que me gusta. ¿Cuál es la sintaxis correcta para generar todo el HTML en display_services? Gracias de antemano por tu ayuda.

Respuesta

22

Sólo una sugerencia para el estilo, me gusta hacer algo como esto:

En su opinión:

<% display_services %> 

Tenga en cuenta que el = no se necesita más. El ayudante entonces utiliza concat() para añadir algo a su página y lo putting-largas cuerdas-juntos es demasiado obsoleto:

def display_services 
    concat("<div>") 
    form_for @user do |f| 
    f.text_field ... 
    end 
    concat("</div>") 
end 

¿Es nessaccary para poner la etiqueta en el <div> ayudante. Si necesita un ayudante para incrustar algo en un bloque que podría utilizar un poco de rendimiento magia así:

def block_helper 
    concat("<div>") 
    yield 
    concat("</div>") 
end 

y utilizarlo como este en su punto de vista - por supuesto con ayudantes también:

<% block_helper do %> 
    cool block<br/> 
    <% display_services %> 
<% end %> 
+0

Dulce, me gusta más su solución, es más limpia, gracias. – Bob

+2

Otra nota, si quiere que su HTML se vea bonito, y "\ n" hasta el final de concat. – Bob

5

Como resultado, que tenía que hacer algo como esto

def display_services 
    html = "<div>" 
    html << (form_for @user do |f| 
    f.text_field ... 
    end) 
    html << "</div>" 
end 

Nota del() envuelto alrededor de la manzana formulario. Si alguien tiene una mejor solución, házmelo saber.

30

En mi humilde opinión, no debería tener código HTML codificado en Ruby. En su lugar, prefiera partials views.

module ServicesHelper 
    def display_services(user) 
    render :partial => "shared/display_services", :locals => {:user => user} 
    end 
end 
+0

Estoy de acuerdo con este enfoque: parece más limpio generar el menor html posible en tu ayuda. – cman77

+0

Aunque he votado esta respuesta y estoy totalmente de acuerdo en que se debe generar la menor cantidad de HTML posible en tu ayudante (me atrevería a decir '¡NINGÚN HTML DEBE SER GENERADO EN UN AYUDANTE!'), Me pregunto sobre el beneficio de este nivel adicional de indirección para una sola línea de código. Seguramente solo aumenta el tiempo necesario para comprender y navegar por la base de código en una fecha posterior, o por un desarrollador diferente. (Aunque, por supuesto, puedo ver que ahorraría golpes de teclado a corto plazo si se usara mucho). –

Cuestiones relacionadas