在应用程序控制器中,包含一个模块common_helper
:
include Commonx::CommonxHelper
方法return_misc_definitions
在CommonxHelper
:
def return_misc_definitions(which_definition)
Commonx::MiscDefinition.where(:active => true, :for_which => which_definition, :token => session[:token])
end
module_function :return_misc_definitions
然后在控制器中,调用上述方法:
@item_category = Commonx::CommonxHelper.return_misc_definitions('wh_item_category')
但规格中有错误:
Failure/Error: @item_category = Commonx::CommonxHelper.return_misc_definitions('wh_item_category')
NameError:
undefined local variable or method `session' for Commonx::CommonxHelper:Module
session
未定义!我的理解是,当从控制器调用方法时,该方法在该方法中可用,因为它已包含在应用程序控制器中。这种理解是否正确?
答案 0 :(得分:4)
您直接在return_misc_definitions
模块上调用Commonx::CommonxHelper
,而不是作为控制器的实例方法。这就是为什么你在session
上收到一个未定义的变量错误 - CommonxHelper
本身不知道session
,除非它(作为include
)混合在一起作为在定义session
的上下文中的实例方法。
由于您include
控制器中的模块,以下内容应该足够了:
@item_category = return_misc_definitions('wh_item_category')
由于您没有使用return_misc_definitions
作为模块/类方法,因此您的module_function
在这方面做得并不多。你可以安全地删除它。
修改强>
考虑到这一点,我并不认为这个模块是必要的,因为它在控制器的上下文之外没有一个有用的位置。为什么不在misc_definitions
中声明ApplicationController
,或者更好地在需要它的特定控制器中声明ItemsController
。也许在CategoriesController
或cshtml
?