【发布时间】:2013-08-26 13:35:31
【问题描述】:
如何在 Rails 中获取模型文件路径?我想要这样的东西:
MyModel.file_path
预期结果:“/app/models/my_model.rb
可以在rails中做还是我需要从模型名称创建文件名并在模型目录中找到它?
【问题讨论】:
标签: ruby-on-rails ruby
如何在 Rails 中获取模型文件路径?我想要这样的东西:
MyModel.file_path
预期结果:“/app/models/my_model.rb
可以在rails中做还是我需要从模型名称创建文件名并在模型目录中找到它?
【问题讨论】:
标签: ruby-on-rails ruby
我认为你必须构建它,但相当简单。
这里是:
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__ 返回的内容很重要。见What does __FILE__ mean in Ruby?。
【讨论】:
[改编自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。
【讨论】: