Duda de concepto sobre partials

Hola amigos,

De nuevo recurro a vosotrs para que me ayudéis a aclarar mis ideas.

Tengo el siguiente problema.

Estoy mostrando a través de un controlador “public_controller.rb”, y por
medio del método “show” una serie de páginas en detalle.
Hasta ahora todo va cómo la seda.
Pero el problema me viene cuando he decidido, “sacar por una ventanita o
modulito” en este caso dentro de un div una noticia, del
“new_controller.rb"y el método
show. Parar ello creo que lo normal sería sacarlo por medio de un
partial "
_mod_news.rhtml”.
¿Pero cómo lo hago sí el controller cargado por URL es “public”?
¿Creo un método “mod_news” que busque esa noticia que quiero sacar (la
más
reciente por ejemlo) y lo invoco en el partial?
O sí no es correcto así, ¿cómo debo plantearlo?

Muchas gracias.

On Dec 8, 2006, at 4:54 PM, Fernando wrote:

ventanita o modulito" en este caso dentro de un div una noticia,
del “new_controller.rb” y el método show. Parar ello creo que lo
normal sería sacarlo por medio de un partial " _mod_news.rhtml".
¿Pero cómo lo hago sí el controller cargado por URL es “public”?
¿Creo un método “mod_news” que busque esa noticia que quiero sacar
(la más reciente por ejemlo) y lo invoco en el partial?
O sí no es correcto así, ¿cómo debo plantearlo?

La manera de invocar a una accion de otro controlador e insertar el
output es render_component. Esta es una funcionalidad que no parece
tener mucho futuro porque a DHH mismo no le gusta, su uso esta en
general desconsejado (en la edicion actual del Agile se explica esto
un poco, DHH tambien hablo de ello en la conferencia).

Las partials necesitan que los datos ya esten ahi cuando se procesa
el template, si hay partials comunes entre vistas se recomienda
factorizar en before filters.

– fxn

Hola Xavier,

Debido a que Rails se encuentra en pleno desarrollo, existe un lugar
donde se liste lo que ya no es una buena practica ya que posiblemente
sufrira cambio en las proximas versiones. Lo que pasa es que resulta un
poco complicado para los que vamos iniciando en Rails.

Gracias.

Jaime Mora R.

Ah, mi tema favorito… los componentes.

Mi impresion es que es un aspecto completamente incomprendido y
comunmente confundido de rails. Cuando DHH empezo a decir que los
componentes eran malos, se referia a Componentes con C mayuscula; a
piezas reusables entre aplicaciones, empleando el subdirectorio
“components” e intentando abstraer funciones complejas. Un componente
de blog, o de comentarios, o cosas por el estilo.

En esa misma epoca, la implementacion de render_component era
bastante lenta. Principalmente porque duplicaba los objetos de
request, session, response y controller indiscriminadamente. Pero
esto es algo que ya ha sido solventado. Si se fijan en las
revisiones, el comentario sobre la lentitud de los componentes
precede a los checkins que optimizaron el rendimiento, y nunca fue
modificado. No me sorprenderia que el mismo DHH dejara el comentario
alli para que la gente evitara hacer Componentes (de nuevo, con C).

Y para poner el ultimo clavo en el ataud. Tambien en esos mismo dias,
muchas instalaciones de Typo, el sistema de blog, empezaron a
quejarse por el performance y el culpable era la gran cantidad de
componentes por pagina que usaba la aplicacion.

El problema que se quiere resolver es muy sencillo: Desde una vista,
invocar otro fragmento arbitrario de HTML (un parcial, generalmente)
cuando este fragmento arbitrario requiere datos adicionales.

Las solucines que proponen incluyen hacer before_filters y usar
parciales; o encapsular la logica del componente en un Proc que es
evaluado en el parcial. O simplemente poner la logica en el parcial
mismo. Y una larga lista de soluciones similares.

Pero es que no hay nada mas simple para resolver eso que un
render_component que invoque una nueva accion, y que esta a su vez
decida que view emplear.

Ezra Zygmuntowicz incluso ha creado un sistema llamado “cells” que
no es mas que components sin usar components. Pero tiene la
desventaja que tus metodos no pueden aprovechar nada de lo que tienes
en los controladores.

En streeteasy empleamos componentes extensivamente. Hemos hecho
pruebas de rendimiento y nuestras conclusiones es que el impacto de
usar componentes es 2 a 3 veces el impacto de emplear parciales, pero
que en ambos casos es generalmente despreciable al compararlo con el
procesamiento real de la accion. Es decir, con un ejemplo: la
ejecucion de un componente dura 10 segundos, de los cuales 1 segundo
corresponde al costo de render_component y 9 segundos corresponden a
la accion. La misma solucion empleando parciales dura 9.5 segundos.

Ese costo se justifica plenamente al mantener una arquitectura mas
simple, donde la logica de una accion esta bien encapsulada y
asociada al view correspondente. Donde queda claro quien hace que, y
no hay que preocuparse de incluir los before_filter apropiados, solo
por si acaso el view decide incluir un parcial que no habias
previsto, etc, etc.

Y es que eso es lo que mas me hace hervir la sangre cuando discuto
sobre componentes. No entiendo como la gente intenta evitar a toda
costa la solucion mas elegante y limpia poniendo como justificacion
el rendimiento de la aplicacion.

Hay rumores de que Rails 2.0 no va a incluir componentes. Yo ya me he
ofrecido a mantener un plugin que ofrezca esa misma funcionalidad. De
hecho, ya tengo un plugin que agrega ciertas ventajas a los
componentes, incluyendo caching (en mi opinion, fragment caching es
completamente inutil si no usas componentes) y alguno que otro
helper. El que este interesado que me deje una nota.

En fin, usen componentes, no les tengan miedo. Y si alguien les
reclama, pues diganle que venga a hablar conmigo.

Saludos,
Sebastian

Y la respuesta a la pregunta original seria algo como:

en views/public/show.rhtml


<%= render_component :controller => “new”, :action =>
“mod_news_component”, :params => {:id => @current.id} %>

(lo de mod_news_component es simplemente una convencion personal de
llamar _component a todas las acciones que solo son utilizadas como
componentes, y lo de :params => {…} es simplemente un ejemplo de
como pasar parametros al componente)

en new_controller
class NewController
def mod_news_component
@news = News.find(params[:id])
render :template => “news/mod_news_component”, :layout => false
end
end

y el view, pues como lo quieras.

Es importante el render explicito para el componente, para poder
decirle que no use layout. En caso contrario, incluiria el layout que
tengas definido para ese controlador, o el general de la aplicacion,
y como el componente va insertado dentro de otra pagina que ya
incluye su propio layout, creo que no se veria muy bonito.

Un detalle sobre componentes… los parametros debes pasarlos todos
en :params. Es posible que puedas pasar :id directamente, pero
cualquier otro parametro va en :params.

Otro detalle. En :params puedes pasar objetos completos. El tipo de
cosas que NO puedes hacer en un URL. Asi que en este ejemplo, hubiera
podido haber dicho algo como :params => {:object => @current} y en
el componente @news = params[:object], ahorrandome asi el find.

On Dec 8, 2006, at 6:02 PM, Jaime Mora R. wrote:

Debido a que Rails se encuentra en pleno desarrollo, existe un lugar
donde se liste lo que ya no es una buena practica ya que posiblemente
sufrira cambio en las proximas versiones. Lo que pasa es que
resulta un
poco complicado para los que vamos iniciando en Rails.

Rails se mueve rapido. La manera de estar al dia es dedicarle horas
basicamente, sobre todo tratar de seguir la lista internacional lo
que buenamente puedas, y tener en general el radar afinado. Como es
un framework grande, uno al principio medio anda estudiando y picando
a la vez, y a la que esta un poco medio situado sale otra release y a
iterar de nuevo. Necesita dedicacion.

Lo mas parecido a lo que pides que conozco son entradas de blog, como
esta

http://www.railtie.net/articles/2006/11/02/deprecations-in-rails-1-2

y es bueno leer posts como este

http://glu.ttono.us/articles/2006/02/06/rails-best-practices-tips-
and-tricks

o este otro

http://glu.ttono.us/articles/2006/08/30/guide-things-you-shouldnt-
be-doing-in-rails

Como compromiso, a la practica tambien resulta esperar a que alguien
publique un delta digerido entre versiones, como estos para la 1.2:

Peak Obsession
Peak Obsession
Peak Obsession

En Rails 1.2 parece ser que puedes conseguir que salgan warnings en
los logs al usar funcionalidades deprecated:

http://ryandaigle.com/articles/2006/07/28/whats-new-in-edge-rails-
explicit-deprecation

– fxn

Hola Xavier

Rails se mueve rapido. La manera de estar al dia es dedicarle horas
basicamente, sobre todo tratar de seguir la lista internacional lo
que buenamente puedas, y tener en general el radar afinado. Como es
un framework grande, uno al principio medio anda estudiando y picando
a la vez, y a la que esta un poco medio situado sale otra release y a
iterar de nuevo. Necesita dedicacion.

Totalmente de acuerdo. No basta solo con leer un libro. Gracias por los
links que has proporcionado, los estoy revisando, son bastante
interesantes y sobre todo fundamentales.

Saludos.

Jaime Mora R.

Pues muchas gracias a todos. Especialmente a Sebastián porque algo de
luz
has arrojado sobre este pobre “novatillo”.

La verdad es que no pensaba que el tema era tan complicao cómo parece, y
veo
que lo de los components genera cierta controversia.

Así que para seguir la solución aportada por Sebastian me tengo que
empollar
primeramente el tema de los components en el libro “Agile…”, que ahora
mismo no recuerdo muy bien cómo se usan. Y es que hasta la fecha no los
he
utilizado, pero vamos, con ello subiremos un peldañito más en el
aprendizaje
de esta maravillosa tecnoogía.

Gracias todos y os seguiré “incordiando” conforme le vaya dando forma y
me
atasque… :slight_smile:

El día 8/12/06, Sebastian D. [email protected] escribió:

Hola Fernando,

Lo malo es que algunos todavía vamos por el libro… :wink:

De los cuales me incluyo -:)), afortunadamente contamos con esta lista
que
nos da la ruta por donde caminar. Saludos.

Gracias.

Jaime Mora R.

En eso tienes toda la razón.
En mí caso, siempre que me he atascado con un problema (y tras onsultar
libros y mr.google) lo he puesto en la lista y al momento simpre hay
alguién
que o bien te da la solución o bien te arroja luz para que la
encuentres…
yo ya no se que haría sin la lista…

2006/12/8, Jaime Mora R. [email protected]:

Lo malo es que algunos todavía vamos por el libro… :wink:

El día 8/12/06, Jaime Mora R. [email protected]
escribió: