如何在rails中获取模型文件路径?我想要这样的东西:
MyModel.file_path
预期结果:“/ app / model / my_model.rb
可以在rails中执行,或者我需要从模型名称创建文件名并在models目录中找到它?
答案 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
。