繁体   English   中英

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

[英]Check if controller has a model in Rails

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

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

def has_model?(controller_klass)
 # TODO
end 

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

此方法不依赖于异常,并且使用输入作为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}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM