imran
imran

Reputation: 646

I want to create a method that will be available in all controllers, and views

i am making a ecommerce application in which the categories are visible in side bar on all pages. i wrote a method in application controller

def categories
  @categories = Category.all
end

but how can i make this method available to all controllers and actions by default so that i dont have to specifically call this method in every action

def list
  categories
  @products = Product.order('title').page(params[:page]).per(4)
end

Upvotes: 6

Views: 5667

Answers (4)

Syed Aslam
Syed Aslam

Reputation: 8807

You can define your method in application_controller.rb and since every other controller inherits from this one, that method will be available to all the controllers. Also, to make it a helper method for it to be available in the views, you can say helper_method :my_method in the application_controller.rb.

Now, for it to be automatically evaluated before any other action in a controller, you can use a before_filter. Add before_filter :my_method in the controller you want this method to be evaluated before any action or in the application_controller.rb

Upvotes: 11

Denis Soloshenko
Denis Soloshenko

Reputation: 21

Maybe the most proper way is to use gem cells. Definitely should try: http://cells.rubyforge.org/

Upvotes: 0

davidb
davidb

Reputation: 8954

I dont thing that there is a way to run this global. You could run it in a before_filter so its called before each action but you must specify this in every controller again!

My Suggestion would be to put the category sidebar stuff in a partial which contains a Call like this:

<% Category.all.each do |category| %>
     <% do stuff to display all categories %>
<% end %>

Then you could simply add the render call to your layout/application.html.erb that would do it for you!

Upvotes: -2

Kaushik Thirthappa
Kaushik Thirthappa

Reputation: 1051

If you want something that has to be across the entire application, like in this case : @categories , then write a helper.

in app/helpers/application_helper.rb

module ApplicationHelper
  def get_all_categories
     @categories = Category.all
  end
end

Upvotes: -1

Related Questions