Sie rufen innerhalb des Klassenbereichs get_locations
auf, aber die Methode ist eine Instanzmethode, keine Klassenmethode. Wenn Sie zum Beispiel def self.get_locations
verwendet haben, dann würden Sie eine Klassenmethode bereitstellen, von denen Sie eine innerhalb des Klassenbereichs verwenden können (nachdem Sie es definiert haben, nicht vorher, wie Sie es tun).
Das Problem hier ist die Logik, für was ist diese Methode? Was wollen Sie für @locations
verwenden? Wenn Sie in Ihre Anwendungsansicht wechseln möchten, sollten Sie diese Methode in das Modul ApplicationHelper
einfügen und von der entsprechenden Aktion aus aufrufen. Wenn Sie es in einer anderen Ansicht auf einen anderen Controller möchten und Sie möchten, dass @locations
in Ihrem locations
Methode verwenden, vielleicht könnte das Setup etwas wie folgt aussehen:
PagesController
class PagesController < ActionController::Base
def locations
@locations = Location.where(:active => true).order('name').all
end
end
Standorte .html.erb
<% @locations.each do |location| %>
<%= # do something with 'location' %>
<% end %>
Wenn Sie das Innere Ihres verwenden möchten application.html.erb
Sie können si mplify es ziemlich einige ..
Application
class ApplicationController < ActionController::Base
protect_from_forgery
def locations
Location.where(:active => true).order('name').all
end
end
application.html.erb
<% locations.each do |location| %>
<%= # do something with location %>
<% end %>
Die Antwort läuft darauf hinaus, Logik nach unten, und wirklich, genau herauszufinden, was Sie suchen, mehr Details wäre wahrscheinlich erforderlich.
Ich brauche @locations für mein Anwendungslayout, aber auch für einen anderen Controller. Der beste Ort, um dies zu setzen? – jmccartie
Wenn Sie in Ihrem Anwendungslayout darauf zugreifen müssen, ist Ihr Anwendungscontroller wahrscheinlich der beste Ort, um ihn zu verwenden, da er auf Ihren Controllern verfügbar ist. Lassen Sie Ihren Controller 'before_filter' auf Ihrer Methode' get_locations' aufrufen, um die Instanzvariable '@ locations' zu füllen –