Я хочу создать метод, который будет доступен во всех контроллерах и представлениях - PullRequest
5 голосов
/ 09 января 2012

Я делаю приложение для электронной коммерции, в котором категории отображаются на боковой панели на всех страницах. я написал метод в контроллере приложения

def categories
  @categories = Category.all
end

но как я могу сделать этот метод доступным для всех контроллеров и действий по умолчанию, чтобы мне не приходилось специально вызывать этот метод в каждом действии

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

Ответы [ 4 ]

10 голосов
/ 09 января 2012

Вы можете определить свой метод в application_controller.rb, и, поскольку каждый другой контроллер наследует от него, этот метод будет доступен для всех контроллеров. Кроме того, чтобы сделать его вспомогательным методом, чтобы он был доступен в представлениях, вы можете сказать helper_method :my_method в application_controller.rb.

Теперь, чтобы он автоматически оценивался перед любым другим действием в контроллере, вы можете использовать before_filter. Добавить before_filter :my_method в контроллере вы хотите, чтобы этот метод оценивался перед любым действием или в application_controller.rb

0 голосов
/ 09 января 2012

Возможно, самый правильный способ - использовать драгоценные клетки. Обязательно стоит попробовать: http://cells.rubyforge.org/

0 голосов
/ 09 января 2012

Я не думаю, что есть способ запустить этот глобальный. Вы можете запустить его в before_filter, чтобы он вызывался перед каждым действием, но вы должны указать это снова в каждом контроллере!

Мое предложение состояло бы в том, чтобы поместить часть боковой панели категории в частичное, которое содержит вызов, как это:

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

Тогда вы можете просто добавить render вызов к вашему layout/application.html.erb, который сделает это за вас!

0 голосов
/ 09 января 2012

Если вы хотите что-то, что должно быть во всем приложении, как в этом случае: @ category , тогда напишите помощник.

в app/helpers/application_helper.rb

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