【问题标题】:rails model file pathrails模型文件路径
【发布时间】:2013-08-26 13:35:31
【问题描述】:

如何在 Rails 中获取模型文件路径?我想要这样的东西:

MyModel.file_path

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

可以在rails中做还是我需要从模型名称创建文件名并在模型目录中找到它?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    我认为你必须构建它,但相当简单。

    这里是:

    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
    

    【讨论】:

    • 是的,我知道这种方式,但我希望它已经在 Rails 中实现了
    • 在子文件夹中工作,除非您定义自己的 load_paths,而不使用普通的类命名空间文件夹结构。
    【解决方案2】:

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

    def self.file_path
      File.expand_path(__FILE__)
    end
    

    def self.file_path
      __FILE__
    end
    

    请注意,Ruby 版本对于 __FILE__ 返回的内容很重要。见What does __FILE__ mean in Ruby?

    【讨论】:

      【解决方案3】:

      [改编自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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-04
        • 1970-01-01
        • 2017-12-07
        • 1970-01-01
        • 1970-01-01
        • 2013-09-26
        • 1970-01-01
        • 2011-07-19
        相关资源
        最近更新 更多