在下拉列表中,我已将所有控制器类及其所有操作动态地移动到另一个下拉列表中,这些操作用于某些操作。有些控制器没有任何模型,如'DashboardsController',没有Dashboard
模型。它仅用于显示仪表板。
所以,基本上我需要过滤掉没有模型的控制器。我需要一个方法来传递控制器类并返回true/false
。
def has_model?(controller_klass)
# TODO
end
答案 0 :(得分:2)
如果您将控制器的名称作为字符串传入,则可以尝试这样的操作。此解决方案假设您的模型在rails 5之前使用ActiveRecord
,其中ApplicationRecord
用于定义模型;在这种情况下,只需使用ActiveRecord::Base
切换ApplicationRecord
。此外,如果您的模型是普通的旧红宝石对象(PORO),那么这对它们不起作用。
def has_model?(controller_klass)
begin
class_string = controller_klass.to_s.gsub('Controller', '').singularize
class_instance = class_string.constantize.new
return class_instance.class.ancestors.include? ActiveRecord::Base
rescue NameError => e
return false
end
end
答案 1 :(得分:0)
此方法不依赖于异常,并且可以将输入用作Class或String。它适用于任何Rails版本:
def has_model?(controller_klass)
all_models = ActiveRecord::Base.descendants.map(&:to_s)
model_klass_string = controller_klass.to_s.sub(/Controller$/,'').singularize
all_models.include?(model_klass_string)
end
注意:您需要设置
config.eager_load = true
在
配置/环境/ development.rb
如果您有非ActiveRecord模型,则可以忽略之前的注释并使用:
all_models = Dir[File.join(Rails.root,"app/models", "**","*.rb")].map{|f| File.basename(f,'.rb').camelize}