2013-08-26 3 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

Это работает для моделей в подпапках? –

+0

Да, я знаю этот путь, но я надеялся, что он уже реализован в рельсах – maki

+0

@LeviStanley, теперь он должен работать. –

1

Вы можете использовать __FILE__ для обозначения текущего пути к файлу:

def self.file_path 
    File.expand_path(__FILE__) 
end 

или

def self.file_path 
    __FILE__ 
end 

Обратите внимание, что версия дела Руби за то, что __FILE__ возвращается. См. 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 применить эту обезьяну патч, require это в config/initializers/active_record.rb.

Смежные вопросы