2009-02-28 14 views
2

Ich habe eine einfache Rails App, die ein Master-Layout für alle Seiten verwendet. Ich möchte eine Fußzeile in diesem Layout haben, die Daten aus dem Modell anzeigt, so dass Sie die Daten sehen können, egal auf welcher Seite Sie sich befinden.Die beste Möglichkeit zum Anzeigen von Modelldaten in einem Master-Layout in einem MVC-Framework

Derzeit habe ich nur einen einzigen Controller, mit ein paar sehr einfachen Ansichten, die in das Layout gerendert werden, ohne dass in der Steuerung bestimmte Aktionsmethoden definiert sind. Das Layout hat so etwas wie:

<div id="footer"><%= controller.get_data %></div> 

Wo get_data, natürlich, nur die Daten aus dem Modell zieht. Dies scheint ein schlechter Weg zu sein, da ich keine weiteren Controller hinzufügen kann, ohne das Layout zu verändern.

Meine Frage ist: Was ist der beste Weg, um Daten aus dem Modell im Hauptlayout angezeigt werden, wenn die Anfrage von einem Controller behandelt werden könnte, die eine Ansicht in das Layout rendern? Wo sollte get_data definiert werden, oder was wäre ein sauberer Weg, damit umzugehen?

Antwort

1

Sie können etwas tun:

Allzweck-Controller Instanzvariablen mit Accessormethoden definieren, wo aktuelle Modellklasse und Instanz speichern:

class ApplicationController 
    attr_accessor :current_model_class, :current_model_instance 
    helper_method :current_model_class, :current_model_instance 
end 

Insbesondere Controller assign Werte ihnen (Sie können legt es auch in einigen vor oder nach dem Filter):

class SomeController < ApplicationController 
    def index 
    self.current_model_instance = SomeModel.find(params[:id]) 
    self.current_model_class = SomeModel 
    end 
end 

definieren sie die gleiche Klasse und Instanz-Methoden in allen Modellen, die t erhalten er Daten für das Layout:

class SomeModel < ActiveRecord::Base 
    def self.get_data 
    # get class specific data 
    end 

    def get_data 
    # get instance specific data 
    end 

end 

Und es in Ihrem Layout-Datei verwenden:

<div id="footer"><%= current_model_instance.get_data %></div> 

oder

<div id="footer"><%= current_model_class.get_data %></div> 
0

Sie können auch diese mit einem before_filter zu tun in der ApplicationController:

class ApplicationController < ActionController::Base 
    before_filter :set_footer_data 

    def set_footer_data 
     @footer_data = MyModel.find(params[:id]) 
    end 
end 

und dann in Ihrem Layout:

<div id="footer"><%= @footer_data %> </div> 
Verwandte Themen