2011-03-31 17 views
9

Usando Rails 2.3.5, Ruby 1.8.7.Rieles: haciendo que la vista "mostrar" y la vista "editar" coincidan

¿Hay algún complemento que haga que sea más fácil hacer que mi "mostrar" y "editar" y las "nuevas" páginas tengan el mismo aspecto? Me encantaría poder hacer el siguiente tipo de cosas. En este momento, si agrego un campo a mi modelo, debo agregarlo a edit.html.erb y view.html.erb. Quiero poder especificar el aspecto bastante extensamente, pero quiero que "editar" y "mostrar" tengan el mismo aspecto (con excepciones entre los dos, quizás, pero no muchos).

¿Hay alguna herramienta SECA para ¿esta?

Esencialmente, me gustaría ser capaz de hacer mi "edit.html.erb" a ser:

<% plugin_form_helper_for @model do |form_helper| %> 
    <%= render :partial => 'common_look', :locals => {:helper => form_helper} %> 
<% end %> 

y ser el show.html.erb:

<% plugin_show_helper_for @model do |show_helper| %> 
    <%= render :partial => 'common_look', :locals => {:helper => show_helper} %> 
<% end %> 

Entonces el "form_helper" y "show_helper" implementarían las mismas interfaces (con cierta capacidad de bifurcación para hacer ligeras diferencias entre el diseño/aspecto de los dos).

Respuesta

0

incluyen ese fragmento en un _form.html.erb y llámenlo en un común parcial como show.html.erb

Luego en su controlador, apunte show y edite el mismo parcial (show.html.erb) o algo así.

+0

no quiero "show" para mostrar los campos de entrada, quiero "show" para hacer que los campos como texto. Solo quiero que la lista de campos, su orden, sus divs que contienen, etc., sean los mismos. –

+0

Estoy de acuerdo Thomas. ¿Has encontrado una buena solución para esto?¡Quiero exactamente lo mismo que estás pidiendo! – MattSlay

2

Hago algo así como lo que está describiendo con funciones de ayuda de entrada/visualización personalizadas. Para un ejemplo simplificado, usted podría tener una función que podría llamarse así:

<%= my_field_helper(:model, :field_name) %> 

Y en su controlador, se establece una variable @context a cualquiera :show o :edit. El código auxiliar contiene un interruptor en @context, y si es :edit, emite algo así como

<li> 
    <label>Translation of Field</label> 
    <input name="model[field_name]" value="???" /> 
</li> 

(posiblemente utilizar un @model la variable genérica en todos los controladores, por lo que la misma función se puede utilizar en todas sus páginas - o @my_model pasar a la función en sí), pero cuando es @context:show (o tal vez de manera predeterminada), se da salida a algo como esto:

<li> 
    <span class="label">Translation of Field</label> 
    <span class="value">Field Value</span> 
</li> 

Así que ahora se puede utilizar el mismo código para mostrar todos los campos! Es probable que desee extraer ese código en un parcial, por lo que puede tenerlo fácilmente envuelto en una forma para editar, pero no para mostrar, pero el bit crítico se logra, si necesita agregar/mover/eliminar campos, solo hay un lugar en el que tienes que hacerlo.

Espero que esto ayude!

+0

Eso es factible, pero agrega una cantidad de métodos en ApplicationHelper, todos los cuales se ramifican en el valor de @context. Cuando el comportamiento se ramifica con tanta frecuencia en una sola variable, me parece que querrá separarlos en dos clases diferentes con la misma interfaz. Ciertamente, así es como lo implementaré yo mismo si termino de implementarlo yo mismo ... –

+0

@Thomas - No es una mala idea. Algo como '@renderer = ShowRenderer.new (@my_model)' en el controlador, y luego '<% = @ renderer.field (: field_name)%>' en la vista ... ¡Me gusta! –

+0

No lo incluiría en el controlador. Más bien, tendría "mostrar" crear el "ShowRenderer". Eso era lo que estaba haciendo en mi fragmento de código original: el plugin_show_helper_for @model {| helper | ...} crearía ShowRenderer y lo pasaría al bloque. (Lo llamé 'ayudante', pero lo llamaremos renderizador). En general, el controlador no debería tener un código que sepa algo sobre el renderizador. (¿Desea crear el mismo @renderer para salida XML, por ejemplo?) –

3

¡Hay un complemento!

https://github.com/codez/dry_crud

Es muy flexible .. sólo asegúrese de que utiliza la versión correcta para rieles 2.3

+0

No me queda claro cómo esto me ayuda, pero profundizaré más. Los ejemplos de nivel superior tratan sobre la generalización en varios controladores, que no es lo que quiero. Quiero que las vistas de formulario "show" y "edit/new" tengan el mismo aspecto para un controlador en particular, con un diseño bastante complicado. Por razones históricas, estoy lidiando con cientos de campos a la vez, separados en grupos a través de pestañas. –

Cuestiones relacionadas