如何从模型中访问应用程序常量?

时间:2011-06-01 12:52:15

标签: ruby-on-rails ruby

我有一个应用程序,用户可以设置一个帐户,该帐户有一个与之关联的公共URL,例如a-la-twitter。 http://myapplication.com/user_directory

为了确保用户无法选择我想要保留的目录(家庭,帮助,设置等),我有一个存储在配置文件中的列表,并通过environment.rb加载。

的environment.rb

# Load the rails application
require File.expand_path('../application', __FILE__)

# Initialize the rails application
MyApplication::Application.initialize!

APP_CONFIG = YAML.load_file("#{Rails.root.to_s}/config/config.yml")[Rails.env]
RESERVED_DIRECTORIES = YAML.load_file("#{Rails.root.to_s}/config/reserved_directories.yml")

这很好用,我可以从视图访问RESERVED_DIRECTORIES数组但是我无法从用户模型访问它。

用户模型

class User < ActiveRecord::Base

  validates_exclusion_of :user_url_dir, :in => RESERVED_DIRECTORIES

end

问题

uninitialized constant User::RESERVED_DIRECTORIES (NameError)

显然存在范围问题,但我不知道从此模型访问RESERVED_DIRECTORIES数组的正确语法是什么。

3 个答案:

答案 0 :(得分:1)

呃,我刚才意识到为什么这不起作用。应用程序初始化后,我正在声明常量。

不起作用

# Load the rails application
require File.expand_path('../application', __FILE__)

# Initialize the rails application
MyApplication::Application.initialize!

APP_CONFIG = YAML.load_file("#{Rails.root.to_s}/config/config.yml")[Rails.env]
RESERVED_DIRECTORIES = YAML.load_file("#{Rails.root.to_s}/config/reserved_directories.yml")

有效吗

# Load the rails application
require File.expand_path('../application', __FILE__)

APP_CONFIG = YAML.load_file("#{Rails.root.to_s}/config/config.yml")[Rails.env]
RESERVED_DIRECTORIES = YAML.load_file("#

# Initialize the rails application
MyApplication::Application.initialize!
{Rails.root.to_s}/config/reserved_directories.yml")

答案 1 :(得分:0)

您可以考虑将RESERVED_DIRECTORIES移动到User模型本身,这会为您提供排序的自动命名空间,并且应该适用于您的代码和规范

我还会考虑直接在代码中而不是在yaml文件中定义保留目录,假设你没有500个,因为这是一个常量我不相信它会在文件后与文件同步初始负荷。

class User
  RESERVED_DIRECTORIES = ['app','private','admin']
end

...用

打电话
validates_exclusion_of :user_url_dir, :in => User::RESERVED_DIRECTORIES

答案 2 :(得分:0)

一种方法是将这样的常量放在config/application.rb文件中,例如:

module MyApplication
  class Application < Rails::Application
    RESERVED_DIRECTORIES = YAML.load_file("#{Rails.root.to_s}/config/reserved_directories.yml")
    ...
  end
end

这样你的常量作用于你的应用程序,可以像这样(从任何地方)访问:

MyApplication::Application::RESERVED_DIRECTORIES