2 Stimmen

Beste Methode zur Anzeige von Modelldaten in einem Stammlayout in einem MVC-Framework

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 sind.

Derzeit habe ich nur einen einzigen Controller, mit ein paar sehr einfache Ansichten, die in das Layout ohne Aktionsmethoden in den Controller definiert gerendert werden. Das Layout hat etwas wie:

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

Wo get_data zieht natürlich nur die Daten aus dem Modell. Dies scheint wie ein schlechter Weg, dies zu tun, weil ich nicht mehr Controller ohne brechen das Layout hinzufügen können.

Meine Frage ist: Was ist der beste Weg, um Daten aus dem Modell abzurufen, die im Hauptlayout angezeigt werden sollen, wenn die Anforderung von einem beliebigen Controller verarbeitet werden könnte, der eine beliebige Ansicht in diesem Layout darstellt? Wo sollte get_data definiert werden, oder was wäre ein sauberer Weg, dies zu behandeln?

1voto

Sie können so vorgehen:

Definieren Sie Allzweck-Controller-Instanzvariablen mit Accessor-Methoden, in denen die aktuelle Modellklasse und -instanz gespeichert werden soll:

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

Insbesondere Controller weisen ihnen Werte zu (Sie können sie auch in einige Vor- oder Nachfilter einsetzen):

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

Definieren Sie dieselbe Klasse und dieselben Instanzmethoden in allen Modellen, die die Daten für das Layout erhalten sollen:

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

  def get_data
    # get instance specific data
  end

end

Und verwenden Sie es in Ihrer Layout-Datei:

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

o

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

0voto

BFree Punkte 100035

Sie könnten dies auch mit einer before_filter en el 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>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X