我正在编写需要一些设置配置的Rails引擎,并检查是否在模型上定义了一些必需的属性。 lib中定义它的引擎类如下。
module Kiosk
mattr_accessor :kiosk_class
@@kiosk_class = 'Computer'
mattr_accessor :kiosk_primary_key
@@kiosk_primary_key = 'id'
mattr_accessor :kiosk_type_foreign_key
@@kiosk_type_foreign_key = 'kiosk_type_id'
mattr_accessor :kiosk_name_attribute
@@kiosk_name_attribute = 'name'
mattr_accessor :kiosk_ip_address_attribute
@@kiosk_ip_address_attribute = 'ip_address'
mattr_accessor :kiosk_mac_address_attribute
@@kiosk_mac_address_attribute = 'mac_address'
# Private config and methods
def self.setup
if block_given?
yield self
end
check_fields!
end
def self.required_fields
[@@kiosk_primary_key, @@kiosk_name_attribute, @@kiosk_ip_address_attribute, @@kiosk_mac_address_attribute, @@kiosk_type_foreign_key]
end
def self.check_fields!
failed_attributes = []
instance = @@kiosk_class.constantize.new
required_fields.each do |field|
failed_attributes << field unless instance.respond_to?(field)
end
if failed_attributes.any?
raise "Missing required attributes in #{@@kiosk_class} model: #{failed_attributes.join(', ')}"
end
end
def self.klass
@@kiosk_class.constantize
end
end
可以在必需的初始化程序中配置模型名称和属性名称,该初始化程序执行调用setup
传递一组配置参数的工作。也就是说,
Kiosk.setup do |config|
# The name of the class that stores info about the kiosks
# It should contain the required fields whose names are defined below
# config.kiosk_class = 'Computer'
# The primary key of the kiosk class
# config.kiosk_primary_key = 'id'
# A foreign key in the kiosk class for the kiosk type
# config.kiosk_type_foreign_key = 'kiosk_type_id'
# An attribute containing the name of the kiosk
# config.kiosk_name_attribute = 'name'
# An attribute containing the IP address of the kiosk
# config.kiosk_ip_address_attribute = 'ip_address'
# An attribute containing the MAC address of the kiosk
# config.kiosk_mac_address_attribute = 'mac_address'
end
我在测试期间遇到的问题是,如果缺少必需属性,则调用任何生成器或Rake任务也会失败,这意味着甚至无法添加属性。
我想要的是能够在我的设置中检测它是作为服务器启动的一部分被调用(因此应该进行字段检查)还是作为任何其他Rails启动,如Rake任务,生成器等。(因此应跳过字段检查)。我觉得必须有一个解决方案,因为启动Rails控制台永远不会失败。
或者,如果无法做到这一点,您将如何在初始化程序之外执行字段检查,但保证在服务器启动期间发生并且每次启动时只发生一次?
我意识到之前已经问过类似的问题,因为他们知道应用程序在哪个上下文中运行(例如How to prevent initializers from running when running `rails generate`和Rails 3 initializers that run only on `rails server` and not `rails generate`, etc),但是那里提供的解决方案对我的情况并不是很有用。