2009-11-04 5 views
2

J'ai un problème dans ma page de contrôleur. Btw je veux exécuter localhost: 3000/article/donat? Author_id = 4, cela signifie que je veux obtenir sur l'article de vue seulement avec author_id = 4 J'ai essayé le code de type comme ceci.Comment filtrer Dans ActionController?

def donat 
    @title = "All blog entries" 
    if params[:author_id] == :author_id 
     @articles = Article.published.find_by_params(author_id) 
    else 
     @articles = Article.published 
    end 
    @articles = @articles.paginate :page => params[:page], :per_page => 20 
    render :template => 'home/index' 
    end 

Cela ne fonctionne pas. Avez-vous des suggestions pour ce cas?

Répondre

8

Vous voulez des ressources imbriquées pour cela, et le getting started guide est un très bon exemple.

Personnellement, je mettrais ce en haut de mon contrôleur:

before_filter :find_author 

Et cela, au fond:

private 
    def find_author 
    @author = Author.find(params[:author_id]) if params[:author_id] 
    @articles = @author ? @author.articles : Article 
    end 

Et puis plus haut dans le contrôleur où je dois trouver des articles :

@articles.find(params[:id]) 

Qui le délimitera de manière appropriée.

+0

Comment ne se find_author appelé ici et @articles Préparez-vous? Avez-vous oublié de mentionner qu'il devra être dans un before_filter? – rnicholson

+0

En effet, mais Emfi a arrangé ça pour moi et je pense que je les utiliserais encore pour l'index et les nouvelles actions. –

+0

J'ai le même problème. Est-ce une bonne pratique ou devrait-elle être évitée? – Federico

1

Vous devriez faire comme Radar suggère (utilisation des ressources imbriquées), mais cela devrait résoudre votre problème immédiat:

def donat 
    @title = "All blog entries" 
    if params[:author_id] # This is where the problem is. 
    published_articles = Article.published.find_by_params(author_id) 
    else 
    published_articles = Article.published 
    end 
    @articles = published_articles.paginate :page => params[:page], :per_page => 20 
    render :template => 'home/index' 
end 
Questions connexes