helper和helper_method做什么?


201

helper_method 很简单:它使视图的某些或所有控制器方法可用。

什么helper啊 是否是相反的方式,即将辅助方法导入文件或模块中?(也许名称helperhelper_method相似。它们可能改为share_methods_with_viewimport_methods_from_view

参考

Answers:


295

该方法helper_method将显式共享控制器中定义的一些方法,以使它们可用于视图。这用于需要从控制器和帮助器/视图访问的任何方法(控制器中不提供标准帮助器方法)。例如常见用例:

#application_controller.rb
def current_user
  @current_user ||= User.find_by_id!(session[:user_id])
end
helper_method :current_user

helper另一方面,该方法是将整个帮助程序导入到控制器(及其继承的控制器)提供的视图中。这意味着在做什么

# application_controller.rb
helper :all

对于Rails> 3.1

# application.rb
config.action_controller.include_all_helpers = true
# This is the default anyway, but worth knowing how to turn it off

使所有帮助程序模块可用于所有视图(至少对于从application_controller继承的所有控制器而言)。

# home_controller.rb
helper UserHelper

使UserHelper方法可用于家庭控制器的操作视图。这等效于:

# HomeHelper
include UserHelper

20
在Rails> = 3.1中,应用程序控制器中的'helper:all'被application.rb中的'include_all_helpers'配置设置代替。请参阅stackoverflow.com/questions/1179865
Jan Hettich 2013年

@杰里米我知道这个帖子很旧,但是说得很对。帮助过我!
Ryan Rebo 2015年

3
使用“ helper”和“ include”之间的区别在于一些简单的语法糖。“帮助程序”使命名模块仅对视图可用。“包含”使命名模块可用于视图和控制器。两者都会影响继承的控制器及其视图。
Richard_G '16

@R_G您是否注意到,最后一个片段include UserHelper位于HomeHelper模块中而不是控制器中?AFAIK,仅在控制器中包含帮助程序模块就不会与视图共享方法。
富兰克林于

@FranklinYu在控制器中包括帮助程序模块实际上将与视图共享方法,因此R_G是正确的。
Magne
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.