2008-10-16 15 views
5

Tengo un problema al tratar de mantener los buscadores de AR SECO en mi aplicación. He creado una aplicación de blog que busca todas las páginas relacionadas, publicaciones, enlaces, etiquetas y categorías de un blog cuando el usuario lo ve por primera vez. Una muestra de la acción show para el controlador Blog se muestra a continuación:¿Cómo mantener la asociación ActiveRecord DRY?

def show 
    #find blog by user name 
    @user= User.find_by_login(params[:id]) 
    @blog= @user.blog 
    @posts = Post.status("publish",@user).find(:all, :order => "created_at DESC") 
    @tags = @user.tags 
    @pages = Page.status("publish",@user).find(:all, :order => "created_at DESC") 
    @links = @user.links.public_link.find(:all, :order => 'created_at DESC') 
    @archives = @posts.group_by(&:month) 
    @categories = @user.categories.group_by(&:name) 
    session[:found_user][email protected] 
    render :layout=>false 
    end 

Como se puede ver que no es muy seco, ya que hay otras acciones que requieren de las mismas variables de instancia como @tags etc aún más en el controlador.

¿Cómo podría hacer esto más SECO? Intenté moverlo al modelo Blog, pero aún necesito llamar a las diversas variables de instancia, como @tags, etc. en el controlador.

¿Hay alguna forma de almacenar todas estas variables cuando se llama por primera vez al blog y volver a utilizarlas en controladores y acciones?

Gracias por cualquier consejo. Estoy usando Rails 2.1

+0

Wah, creo que tienes algunos problemas con tu tecla shift. – Node

+0

En serio. Tu pregunta me lastima los oídos. –

Respuesta

3

Leí en un blog en alguna parte para simplemente reemplazar antes de los filtros (o cargar todo tipo de datos en el método del controlador) con los métodos de ayuda. Algo como esto:

class BlogsController < ApplicationController 
    def show 
    session[:found_user][email protected] 
    render :layout=>false 
    end 

    helper_method :user, :blog, :posts, :tags, :pages, :links, :archives, :categories 

    protected 
    def user 
    @user ||= User.find_by_login(params[:id]) 
    end 

    def blog 
    @blog ||= user.blog 
    end 

    def posts 
    @posts ||= Post.status("publish", user).find(:all, :order => "created_at DESC") 
    end 

    def tags 
    @tags ||= user.tags 
    end 

    def pages 
    @pages ||= Page.status("publish", user).find(:all, :order => "created_at DESC") 
    end 

    def links 
    @links ||= user.links.public_link.find(:all, :order => 'created_at DESC') 
    end 

    def archives 
    @archives ||= posts.group_by(&:month) 
    end 

    def categories 
    @categories ||= user.categories.group_by(&:name) 
    end 
end 

## app/views/blogs/show.html.erb 
<p>Name: <%=h user.name %></p> 
<h3><%= posts.length %> Posts</h3> 
<% posts.each do |post| %> 
    ... 
<% end %> 
<ul> 
    <% categories.each do |category| %> 
    <li><%=h category %></li> 
    <% end %> 
</ul> 

Vea cómo en la vista usar algo simplemente llama a la base de datos. Una ventaja de esta solución es que los métodos auxiliares que no se llaman no tomarán tiempo de la acción.

Si es necesario, abstraiga los métodos de ayuda en un módulo e incluya el módulo en ApplicationController.

Cuestiones relacionadas