2013-08-26 108 views
2

如何在导轨中获取模型文件路径?我想这样的事情:导轨模型文件路径

MyModel.file_path 

预期的结果:“/app/models/my_model.rb

有可能在轨道做或者我需要从模型名创建文件名,发现它在车型?目录

回答

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 
+0

这是否适用于子文件夹内的模型? – 2013-08-26 14:39:28

+0

是的,我知道这种方式,但我希望它已经实施了轨道 – maki

+0

@LeviStanley,现在它应该工作。 –

1

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

def self.file_path 
    File.expand_path(__FILE__) 
end 

def self.file_path 
    __FILE__ 
end 

注意什么__FILE__回到了Ruby版本的问题。请参阅What does __FILE__ mean in Ruby?

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的应用此猴补丁,requireconfig/initializers/active_record.rb