Rails:在哪里定义一个可供多个控制器使用的辅助方法?

时间:2011-01-19 10:51:48

标签: ruby-on-rails ruby-on-rails-3

我想定义一个辅助方法my_method,它可以在BuyersController方法中使用(例如indexcreate,e.t.c。)。

我尝试在app/helpers/application_helper.rb中定义它,但它不起作用:

undefined method `my_method' for #<BuyersController:0x26df468>

它应该在某个共享位置,因为我也希望在其他控制器中使用它。这就是我尝试app/helpers/application_helper.rb

的原因

定义它的正确位置是什么?

5 个答案:

答案 0 :(得分:14)

应该在app/controllers/application_controller.rb

app/helpers/application_helper.rb用于共享视图帮助程序。

答案 1 :(得分:2)

您应该在应用程序控制器中包含应用程序帮助程序模块,以便在请求期间其所有方法(所有控制器和视图)都可用。

class ApplicationController < ActionController::Base
  helper ApplicationHelper
  …
end

请参阅helper方法

的API文档

答案 2 :(得分:2)

从Rails 3开始,您也可以在控制器内调用view_context.my_method

答案 3 :(得分:2)

展开accepted answer,如果 希望与视图共享控制器方法,helper_method似乎非常适合这种情况。在控制器中声明helper_method使视图可以访问。

class ApplicationController < ActionController::Base
  helper_method :current_user, :logged_in?

  def current_user
    @current_user ||= User.find_by(id: session[:user])
  end

  def logged_in?
    current_user != nil
  end
end

答案 4 :(得分:0)

在rails 4之前,具有相同控制器名称的辅助对象仅在其控制器和视图中可用。从rails 4开始,所有助手都可用于所有控制器(如果包含)和视图。话虽如此,所有助手将在您的视图中共享。

注意:如果您不希望特定控制器使用此行为,则可以使用clear_helpers,它将仅包含具有相同控制器名称的帮助程序。

有关使用助手的更多信息,请参见this