2

我在 Rails 中有这个(简化的)辅助函数:

include Constants

def link_to_neighbour(direction, path)
  symbol = direction.upcase.constantize
  link_to symbol, path
end

lib/constants我定义了这些常量:

PREVIOUS = "<<"
NEXT = ">>"

然而,当我在我的一个观点中使用这样的东西时......

<%= link_to_neighbour('next', @user, user_path(@user)) %>

...我经常收到此错误:

NameError
uninitialized constant NEXT

我在这里想念什么?

谢谢你的帮助。

4

3 回答 3

2

你可以使用const_missing红宝石的钩子。

def self.const_missing(name)
  const_set(name, some_value)
end

但这里的问题似乎是您没有在应用程序的 application.rb 中加载“lib/constants.rb”文件。

将此行放入您的 'config/application.rb'

# Autoload lib/ folder including all subdirectories
config.autoload_paths += Dir["#{config.root}/lib/**/"]

如果您不想将此行放在“config/application.rb”中,则将 constants.rb 从 lib 移动到“config/initializers/”文件夹中。您的 Rails 应用程序会自动加载其中的每个文件。

于 2013-07-16T12:06:58.607 回答
1

您的方法应如下所示:

def link_to_neighbour(direction, path)
  symbol = Object.const_get(direction.upcase)
  link_to symbol, path
end

希望这会有所帮助。

于 2013-07-16T12:11:45.223 回答
0

我会用一个constants.yml

directions:
  PREVIOUS: "<<"
  NEXT: ">>"

这样我就可以使用常量树。

然后在初始化程序中:

Constants = OpenStruct.new YAML.load_file(Rails.root.join('config/constants.yml')).with_indifferent_access

然后在辅助方法中:

def link_to_neighbour(direction, path)
  symbol = Constants.directions[direction.upcase]
  link_to symbol, path
end
于 2013-07-16T22:28:58.357 回答