我想创建一个可在所有控制器和视图中使用的方法

时间:2012-01-09 13:07:40

标签: ruby-on-rails global before-filter view-helpers

我正在制作一个电子商务应用程序,其中所有页面上的侧栏都可以看到类别。我在应用程序控制器中编写了一个方法

def categories
  @categories = Category.all
end

但是我怎么能默认这个方法可用于所有控制器和动作,这样我就不必在每个动作中专门调用这个方法

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

4 个答案:

答案 0 :(得分:10)

您可以在application_controller.rb中定义方法,并且由于每个其他控制器都继承自此方法,因此该方法可供所有控制器使用。另外,要使其成为可在视图中使用的辅助方法,您可以在helper_method :my_method中说application_controller.rb

现在,为了在控制器中的任何其他操作之前自动评估它,您可以使用before_filter。添加before_filter :my_method 在控制器中,您希望在任何操作之前或在 application_controller.rb

中评估此方法

答案 1 :(得分:0)

如果您想要在整个应用程序中使用某些内容,例如: @categories ,请编写帮助程序。

app/helpers/application_helper.rb

中的

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

答案 2 :(得分:0)

也许最合适的方法是使用宝石细胞。绝对应该尝试:http://cells.rubyforge.org/

答案 3 :(得分:-2)

我不认为有办法运行这个全局。您可以在before_filter中运行它,以便在每个操作之前调用它,但您必须再次在每个控制器中指定它!

我的建议是将类别侧边栏的东西放在包含如下调用的部分中:

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

然后,您只需将render电话添加到layout/application.html.erb,即可为您执行此操作!