2012-05-12 33 views
0

我在初始化器目录中使用一个文件来声明用于应用程序不同部分的常量。Rails:在初始化器文件内部创建一个哈希并使用它

FIRST_STR = "First Name" 
LAST_STR = "Last Name" 
new_user_hash = Hash.new 
new_user_hash[ "first" ] = FIRST_STR 
new_user_hash[ "last" ] = LAST_STR 

我在应用程序的不同部分使用FIRST_STRLAST_STR没有问题,但是当我尝试使用new_user_hash,我收到以下错误信息:

未定义的局部变量或方法`new_user_hash “为#<#:在一个文件中0x007f8da5752da0>

这难道不是可以定义/声明散列,而在另一个使用它?

+0

如果你想使用'new_user_hash'?它不能在该文件之外访问,因为它是一个局部变量。 –

回答

7

我认为你可能会遇到范围限制 - new_user_hash是本地的,可能不适用于其他应用程序。如果您将其设为全球(通过将其称为$new_user_hash)它将可用。在FIRST_STRLAST_STR的情况下,它们是实际上是全局的常量。

更新你的代码之一:

$new_user_hash = { "first" => FIRST_STR, "last" => LAST_STR } 

NEW_USER_HASH = { "first" => FIRST_STR, "last" => LAST_STR } 

而且你将能够从你的应用程序的其他部分访问$new_user_hashNEW_USER_HASH

另一种策略是定义一个模块:

MyAppConfig::NEW_USER_HASH["first"] 

这是因为它不”一个比较公认的做法:

module MyAppConfig 
    NEW_USER_HASH = { "first" => FIRST_STR, "last" => LAST_STR } 
end 

然后在其他地方,你可以通过模块名前缀来访问它创建更多的全局变量。

+1

'MyAppConfig'可能作为一个模块更有意义,因为它并不意味着是新的,并且仅仅是一个封装常量的容器。 –

+0

这是一个伟大的观点安德鲁。谢谢,我会更新我的答案。 –

+0

感谢您的所有建议。我会尝试一些东西,并发布有用的东西。是的,这是一个范围界定问题。当我将哈希声明移到我使用它的文件中时,它工作正常。 –

相关问题