【问题标题】:Rails Root directory path?Rails 根目录路径?
【发布时间】:2011-04-13 01:48:12
【问题描述】:

如何获取 Rails 应用的根目录路径?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:
    module Rails
      def self.root
        File.expand_path("..", __dir__)
      end
    end
    

    来源: https://github.com/rails/rails/blob/5259062868dcf10fbcf735d6520e6a14e15fdcdb/actionmailer/test/abstract_unit.rb#L12

    【讨论】:

      【解决方案2】:

      在 Rails 3 和更新版本中:

      Rails.root
      

      它返回一个Pathname 对象。如果你想要一个字符串,你必须添加.to_s。如果您想在 Rails 应用程序中使用其他路径,可以像这样使用join

      Rails.root.join('app', 'assets', 'images', 'logo.png')
      

      在 Rails 2 中,您可以使用 RAILS_ROOT 常量,它是一个字符串。

      【讨论】:

      • 在 Rails 2.3 中 Rails.root 是 Pathname 的一个实例,其中 RAILS_ROOT 是一个字符串。
      • 仅 Rails.root 3.1 及更高版本(啊.. 更改 CONSTANT 的情况;))
      • 你也可以Rails.root.join(*%w( app assets images logo.png ))
      • 我个人喜欢较新的语法:Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
      【解决方案3】:

      只需编写 Rails.root 并附加任何内容 Rails.root.join(*%w(app assets)).to_s

      【讨论】:

      • 请删除这个答案,它只是噪音,不会给问题添加任何东西,而且格式很差。
      【解决方案4】:

      只需通过 Rails.root 或者如果您想附加一些东西,我们可以使用它,例如 Rails.root.join('app', 'assets').to_s

      【讨论】:

      • 请删除这个答案,它只是噪音,不会对问题添加任何内容。
      【解决方案5】:

      在某些情况下,您可能需要 Rails 根目录而不需要加载 Rails。

      例如,通过要求 spec_helper 而不是 rails_helper 来对不依赖 Rails 的模型进行 TDD 时,您可以获得更快的反馈周期。

      # spec/spec_helper.rb
      
      require 'pathname'
      
      rails_root = Pathname.new('..').expand_path(File.dirname(__FILE__))
      
      [
        rails_root.join('app', 'models'),
        # Add your decorators, services, etc.
      ].each do |path|
        $LOAD_PATH.unshift path.to_s
      end
      

      这使您可以轻松地从其规范文件中加载普通旧 Ruby 对象。

      # spec/models/poro_spec.rb
      
      require 'spec_helper'
      
      require 'poro'
      
      RSpec.describe ...
      

      【讨论】:

        【解决方案6】:

        你可以使用:

        Rails.root
        

        但是要加入你可以使用的资产:

        Rails.root.join(*%w( app assets))
        

        希望这对您有所帮助。

        【讨论】:

          【解决方案7】:

          除了所有其他正确答案之外,由于 Rails.rootPathname 对象,这将不起作用:

          Rails.root + '/app/assets/...'
          

          你可以使用join之类的东西

          Rails.root.join('app', 'assets')
          

          如果你想要一个字符串,使用这个:

          Rails.root.join('app', 'assets').to_s
          

          【讨论】:

          • 实际上Rails.root + 'app/assets' 确实 工作,但是join 更整洁。
          • 硬编码文件分隔符标记(\ 或 /)通常不是一个好主意。
          【解决方案8】:

          您可以使用变量RAILS_ROOT 访问rails 应用程序路径。

          例如:

          render :file => "#{RAILS_ROOT}/public/layouts/mylayout.html.erb"
          

          【讨论】:

          • RAILS_ROOT 已被废弃,因为 Rails 3.0 安装了使用 Rails.root
          【解决方案9】:

          为了超级正确,你应该使用:

          Rails.root.join('foo','bar')
          

          这将允许您的应用在/ 不是目录分隔符的平台上运行,如果有人尝试在其中运行它的话。

          【讨论】:

          • 例如,在我的 MacBook 上,Rails.root.join('foo','bar') 计算为 @path 为 '/Users/purplejacket/my_rails_app/foo/bar' 的 Pathname 对象
          猜你喜欢
          • 1970-01-01
          • 2016-01-12
          • 1970-01-01
          • 2011-01-22
          • 2015-08-22
          • 1970-01-01
          • 2012-07-21
          • 2011-09-19
          • 1970-01-01
          相关资源
          最近更新 更多