2010-03-22 8 views
2

Je me bats avec quelque chose qui devrait être très simple - spécifier une barre latérale au niveau du contrôleur. Avec mise en page que vous pouvez faire ceci:Façon simple de spécifier la barre latérale dans le contrôleur

layout 'admin' 

donc je voudrais faire la même chose pour une barre latérale, avec quelque chose comme ceci:

sidebar 'search' 

Je sais que je pourrais spécifier le balisage de la barre latérale avec content_for dans les vues, mais je préfère spécifier la barre latérale au niveau du contrôleur et ne pas répéter le code dans (et encombrer) mes vues. J'aimerais aussi pouvoir partager des sidebars entre contrôleurs.

Au moment où j'ai cela dans un initialiseur (un plugin semble overkill pour quelque chose si simple):

module Sidebar 
    def self.included(base) 
    base.extend(ClassMethods) 
    end 

    module ClassMethods 
    def sidebar(partial) 
     # neither of these two work... 
     @sidebar = partial 
     instance_variable_set('@sidebar', partial) 
    end 
    end 
end 

ActionController::Base.send(:include, Sidebar) 

puis dans ma mise en page que je suis en train

<%= render "shared/#{@sidebar}" %> 

mais en vain ...

Est-ce que quelqu'un sait ce que je fais mal, ou si en effet je vais à ce sujet dans le bon sens du tout? Toute aide est grandement appréciée!

Répondre

3

Ceci est un problème de portée. La vue nécessite une variable d'instance mais votre méthode sidebar fonctionne dans la portée de la classe.

module Sidebar 
    def self.included(base) 
    base.extend(ClassMethods) 
    end 

    module ClassMethods 
    def sidebar(partial) 
     before_filter do |controller| 
     controller.instance_eval { @sidebar = partial } 
     end 
    end 
    end 
end 

ActionController::Base.send(:include, Sidebar) 

Si tous vos contrôleurs comprennent une barre latérale, vous pouvez alors envisager de définir une variable d'instance dans votre contrôleur d'application. En outre, si vous n'avez pas d'autres méthodes, vous pouvez encore simplifier votre mixage.

class ApplicationController < ActionController::Base 
    attr_accessor :sidebar 
end 

module Sidebar 
    def sidebar(partial) 
    before_filter do |controller| 
     controller.sidebar = partial 
    end 
    end 
end 

ActionController::Base.extend(Sidebar) 

Personnellement je n'aime pas trop cette approche. Je préfère définir le contenu d'une barre latérale dans le fichier de vue et revenir à une valeur standard si aucune valeur personnalisée n'est définie.

+0

Salut Simone, merci pour votre réponse, cela a du sens. J'y ai pensé cependant et j'en suis arrivé à la conclusion que, bien que cela puisse signifier de spécifier la même barre latérale dans toutes les vues pour un contrôleur, il est préférable de définir la barre latérale dans la vue et de revenir à une valeur par défaut. dire. À votre santé Dave –

Questions connexes