我有一个应用程序,用户可以设置一个帐户,该帐户有一个与之关联的公共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数组的正确语法是什么。
答案 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