检查控制器是否在Rails中有模型

时间:2016-10-26 14:54:45

标签: ruby-on-rails

在下拉列表中,我已将所有控制器类及其所有操作动态地移动到另一个下拉列表中,这些操作用于某些操作。有些控制器没有任何模型,如'DashboardsController',没有Dashboard模型。它仅用于显示仪表板。

所以,基本上我需要过滤掉没有模型的控制器。我需要一个方法来传递控制器类并返回true/false

def has_model?(controller_klass)
 # TODO
end 

2 个答案:

答案 0 :(得分:2)

如果您将控制器的名称作为字符串传入,则可以尝试这样的操作。此解决方案假设您的模型在rails 5之前使用ActiveRecord,其中ApplicationRecord用于定义模型;在这种情况下,只需使用ActiveRecord::Base切换ApplicationRecord。此外,如果您的模型是普通的旧红宝石对象(PO​​RO),那么这对它们不起作用。

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}