如何在 Rails 中获取模型文件路径?我想要这样的东西:
MyModel.file_path
预期结果:“/app/models/my_model.rb
可以在 Rails 中执行,或者我需要从模型名称创建文件名并在模型目录中找到它?
如何在 Rails 中获取模型文件路径?我想要这样的东西:
MyModel.file_path
预期结果:“/app/models/my_model.rb
可以在 Rails 中执行,或者我需要从模型名称创建文件名并在模型目录中找到它?
我认为你必须构建它,但相当简单。
它是这样的:
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
您可以使用__FILE__
来引用当前文件路径:
def self.file_path
File.expand_path(__FILE__)
end
或者
def self.file_path
__FILE__
end
请注意,Ruby 版本对__FILE__
返回的内容很重要。请参阅Ruby 中的 __FILE__ 是什么意思?.
[改编自这个答案的一部分到一个更一般的问题]
在一个简单的 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
.