Noob scoping issue, I imagine. :\\
class ApplicationController < ActionController::Base
protect_from_forgery
@locations = get_locations
def get_locat
You're calling get_locations
within the class scope, but the method is an instance method, not a class method. If for example you used def self.get_locations
then you would be providing a class method, one of which you can use within the class scope (after you have defined it, not before like you're doing).
The problem here is the logic, what is this method for? What do you intend to use @locations
for? If it's to go inside your application view, then you should put this method into the ApplicationHelper
module, and call it from inside the relevant action. If you'd like it in another view on another controller and you'd like to use @locations
inside your locations
method, perhaps your setup might look something like this:
PagesController
class PagesController < ActionController::Base
def locations
@locations = Location.where(:active => true).order('name').all
end
end
locations.html.erb
<% @locations.each do |location| %>
<%= # do something with 'location' %>
<% end %>
If you'd like to use this inside of your application.html.erb
you can simplify it quite some..
ApplicationController
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 %>
The answer boils down to logic, and to really figure out exactly what you're looking for, more details would probably be required.
Even the question is quite old, you can also call your controller action anywhere just by calling:
ApplicationController.new.get_locations
You're calling it from the class scope, not from an instance scope. more likely what you want is the following:
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :setup_locations
private
def setup_locations
@locations = Location.where(:active => true).order('name').all
end
end
To make your original example work, you'd need to make #get_locations defined on self (which points to the class at definition), like so:
class ApplicationController < ActionController::Base
protect_from_forgery
@locations = get_locations
def self.get_locations
Location.where(:active => true).order('name').all
end
end
The problem with that code is that @locations will only be available from the class level as a class instance variable, which is comparable to a static variable in most other languages, and which probably isn't what you want.
I imagine that this line:
@locations = get_locations
... is trying to access the class level method get_locations
and not the instance method.
The clue here is that the error message is showing that it can't find it on the class itself (ApplicationController:Class) and not an instance of that class. That means that you're in the class scope, not instance scope.
This would fix it:
def self.get_locations
Location.where(:active => true).order('name').all
end