Rails: 在哪里定义一个帮助方法,使其对多个控制器可用?

7
我想定义一个帮助方法my_method,该方法将在BuyersController方法(如indexcreate等)中可用。
我尝试在app/helpers/application_helper.rb中定义它,但它没有起作用:
undefined method `my_method' for #<BuyersController:0x26df468>

我希望它能放在某个共享位置,因为我还想在其他控制器中使用它。这就是为什么我尝试了app/helpers/application_helper.rb

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

5个回答

14

这段代码应该放在app/controllers/application_controller.rb文件中。

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


4
我认为Misha正在询问控制器和视图中可用的方法。在 ApplicationController 中定义的方法将对所有控制器可用,但对于它们的视图不可用。 - edgerunner
实际上,我对视图方法不感兴趣。 - Misha Moroshko
为了完整性,在现代的Rails版本中,可以通过在控制器中使用helper_method :foo将控制器方法foo定义为视图助手。 - Satya

2

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

class ApplicationController < ActionController::Base
  helper ApplicationHelperend

请参阅API文档中的helper方法相关章节。(链接)

2

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


2
扩展接受的答案,如果您希望与视图共享控制器方法,则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

1

在 Rails 4 之前,具有相同控制器名称的帮助程序仅在其控制器和视图中可用。从 Rails 4 开始,所有帮助程序都可用于所有控制器(如果您已包含它们)和视图。也就是说,所有帮助程序将在您的视图之间共享。

注意:如果您不希望特定控制器出现这种行为,您可以使用 clear_helpers,它只会包含与控制器名称相同的帮助程序。

有关使用帮助程序的更多信息,请参见this


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接