2008-10-16 10 views
5

Ich habe ein Problem mit dem Versuch, AR Finders DRY in meiner Anwendung zu halten. Ich habe eine Blog-Anwendung erstellt, die alle zugehörigen Seiten, Posts, Links, Tags und Kategorien für ein Blog abruft, wenn ein Benutzer sie zum ersten Mal sieht. Eine Probe show-Aktion für den Blog-Controller ist unten dargestellt:Wie ActiveRecord Association DRY beibehalten?

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 

Wie man es sehen kann, ist nicht sehr trocken, da es andere Aktionen sind, die auf den gleichen Instanzvariablen nennen wie @tags usw. weiter in der Steuerung.

Wie könnte ich dies mehr trocken machen? Ich habe versucht, es in das Blog-Modell zu verschieben, aber ich muss immer noch die verschiedenen Instanzvariablen wie @Tags usw. im Controller aufrufen.

Gibt es eine Möglichkeit, alle diese Variablen zu speichern, wenn der Blog zum ersten Mal aufgerufen wird, und sie über Controller und Aktionen hinweg wiederzuverwenden?

Vielen Dank für einen Hinweis. Ich benutze Schienen 2.1

+0

Wah, ich denke du hast ein paar Probleme mit deinem Shiftkey. – Node

+0

Ernsthaft. Deine Frage tut mir weh. –

Antwort

3

Ich lese in einem Blog irgendwo einfach vor Filter (oder Laden aller Arten von Daten in der Controller-Methode) mit Hilfsmethoden zu ersetzen. Etwas wie folgt aus:

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> 

Sehen Sie, wie in der Ansicht einfach mit irgendetwas auf der Datenbank aufruft. Ein Vorteil dieser Lösung besteht darin, dass Helfermethoden, die nicht aufgerufen werden, keine Zeit von der Aktion benötigen.

Falls erforderlich, abstrahieren Sie die Hilfsmethoden in ein Modul und fügen Sie das Modul in ApplicationController ein.