【问题标题】:Rails: path of fileRails:文件路径
【发布时间】:2012-10-30 20:42:15
【问题描述】:

我在app 中有一个名为csv 的目录,在这个目录中我有一个名为names.csv 的文件 我想使用File.read(path:string)函数来读取文件。
文件的相对路径是什么?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:
    file = File.join(Rails.root, 'app', 'csv', 'names.csv')
    File.read(file)
    

    【讨论】:

    • 没有必要使用File.join,因为Rails.root 是一个Pathname 对象。只需这样做:Rails.root + "app/csv/names.csv"
    • 特别是,File.join 不会保护您免受一个或多个路径部分是“..”的影响,并且会很高兴地生成类似“app/csv/../controllers/users_controller”的路径.rb' 如果给定 File.join(Rails.root, 'app', 'csv', '../controllers/user_controller.rb') 或 File.join(Rails.root, 'app', 'csv', ' ..', '控制器', 'user_controller.rb')
    • 致@RyanBigg 的评论:每次在路径中使用反斜杠或正斜杠时,都会使您的应用程序特定于操作系统。 File.join 是更安全的方式
    【解决方案2】:

    你应该这样做:Rails.root.join "app", "csv", "names.csv"

    Rails.root 返回一个 PathName 对象。 PathName 有一个join 方法,它接受任意数量的参数并将其附加到路径名以创建新路径。

    在此处阅读 PathName#join:

    http://www.ruby-doc.org/stdlib-1.9.3/libdoc/pathname/rdoc/Pathname.html#method-i-join

    【讨论】:

      【解决方案3】:

      Rails.root 指向 Rails 项目的顶层文件夹,因此路径为:

      File.read(File.join(Rails.root, 'app','csv','names.csv'))
      

      【讨论】:

        【解决方案4】:

        感谢以上答案,它对我也有效:

        "#{Rails.root}/public/spreadsheets/file_name.xlsx"
        

        【讨论】:

        • 它使路径特定于操作系统
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-18
        • 2013-02-11
        • 2018-09-29
        • 2017-03-09
        • 2014-09-19
        • 1970-01-01
        相关资源
        最近更新 更多