【问题标题】:I want to create a method that will be available in all controllers, and views我想创建一个在所有控制器和视图中都可用的方法
【发布时间】:2012-02-06 00:22:27
【问题描述】:

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

def categories
  @categories = Category.all
end

但是我怎样才能让这个方法在默认情况下对所有控制器和动作都可用,这样我就不必在每个动作中专门调用这个方法

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

【问题讨论】:

  • 在 application_controller 中定义该方法并在应用控制器定义后添加helper_method :categories(你想要的称为helper_method

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      然后您只需将 render 调用添加到您的 layout/application.html.erb 即可!

      【讨论】:

      • You could run it in a before_filter so its called before each action but you must specify this in every controller again ... 如果在 ApplicationController 中放置 before_filter,则不必在每个控制器操作中再次指定它(因为默认情况下它们继承过滤器)。此外,您正在视图中进行模型调用,这绝不是一件好事。轻松地抛出 f 字。
      • 在视图中调用all 没问题,只要其中没有属于model 或@987654329 的逻辑,就可以调用模型上的方法@.
      • 我认为这样的东西肯定属于视图,可能属于助手。我会在它周围添加 并更新侧边栏类别会使此无效。
      【解决方案4】:

      如果您想要一些必须跨越整个应用程序的东西,例如在这种情况下:@categories ,然后编写一个帮助程序。

      app/helpers/application_helper.rb

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-13
        • 2012-07-02
        相关资源
        最近更新 更多