RAILS:会话未在应用程序控制器中包含的模块中定义

时间:2016-04-18 20:09:20

标签: ruby-on-rails session

在应用程序控制器中,包含一个模块common_helper

include Commonx::CommonxHelper

方法return_misc_definitionsCommonxHelper

中定义
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未定义!我的理解是,当从控制器调用方法时,该方法在该方法中可用,因为它已包含在应用程序控制器中。这种理解是否正确?

1 个答案:

答案 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。也许在CategoriesControllercshtml