rails模型文件路径

时间:2013-08-26 13:35:31

标签: ruby-on-rails ruby

如何在rails中获取模型文件路径?我想要这样的东西:

MyModel.file_path

预期结果:“/ app / model / my_model.rb

可以在rails中执行,或者我需要从模型名称创建文件名并在models目录中找到它?

3 个答案:

答案 0 :(得分:3)

我认为你必须建立它,但相当简单。

这就是:

def model_path
  model_file = self.class.name.split("::").map {|c| c.downcase }.join('/') + '.rb'
  path = Rails.root.join('app/models/').join(model_file)
end

答案 1 :(得分:1)

您可以使用__FILE__来引用当前文件路径:

def self.file_path
  File.expand_path(__FILE__)
end

def self.file_path
  __FILE__
end

请注意,Ruby版本对__FILE__返回的内容很重要。请参阅What does __FILE__ mean in Ruby?

答案 2 :(得分:0)

[从this answer的部分改编为更一般的问题]

在一个简单的Rails应用程序中,应用程序的模型类在其app/models目录中定义,文件路径可以从类名确定性地派生。可以在特定的模型类MyModel中定义检索此路径的方法,如下所示:

class MyModel
  def self.file_path
    Rails.root.join('app', 'models', "#{klass.name.underscore}.rb").to_s
  end
end

例如,此特定模型类MyModel将在APP_ROOT/app/models/my_model.rb中定义,其中APP_ROOT是应用程序的根目录路径。

为了概括这一点,可以在所有模型类中定义这样的方法,并考虑简单Rails路径配置的扩展。在定义模型定义的自定义路径的Rails应用程序中,必须考虑所有这些路径。此外,由于可以在应用程序加载的任何Rails引擎中定义任意模型类,因此还必须考虑其自定义路径,查看所有已加载的引擎。以下代码结合了这些注意事项。

module ActiveRecord
  class Base
    def self.file_path
      candidates = Rails.application.config.paths['app/models'].map do |model_root|
        Rails.root.join(model_root, "#{name.underscore}.rb").to_s
      end
      candidates += Rails::Engine::Railties.engines.flat_map do |engine|
        engine.paths['app/models'].map do |model_root|
          engine.root.join(model_root, "#{name.underscore}.rb").to_s
        end
      end
      candidates.find { |path| File.exist?(path) }
    end
  end
end

要让Rails在require中应用此猴子补丁config/initializers/active_record.rb