【问题标题】:Possible oneliner for this Ruby on Rails code此 Ruby on Rails 代码的可能单行器
【发布时间】:2015-10-29 23:12:19
【问题描述】:

我有一个 Rails ActionDispatch::Http::UploadedFile 类型的文件对象。

我需要用通用名称覆盖用户分配的文件名,同时保留文件的扩展名。这就是我目前实现代码的方式。有没有更好更优雅的方式在 Ruby 中编写它。

extension = File.extname(file_name.original_filename)
file_name.original_filename = "hello#{extension}"

【问题讨论】:

  • 'test.pdf'.sub(/^.*\.([^.])$/, 'hello.\1') 返回相同的文件名。
  • 为什么一定要排成一行? “更好”和“优雅”并不一定是一条线。

标签: ruby-on-rails ruby file actiondispatch


【解决方案1】:
file.original_filename.sub!(/.*\./, "hello.")

这行得通,因为 .* 是贪婪的,会吞噬一切直到最后。它发现。那恰好是扩展之前的那个。

或者做一个精确的替换,你可以这样做:

file_name.original_filename = "hello" + File.extname(file_name.original_filename)

从技术上讲,仍然是单线哈哈。

【讨论】:

    【解决方案2】:

    编辑:我误解了。 (我认为new_name 包含一个将被"old_fname" 的扩展名替换的扩展名。)正如@Bassel 所说(谢谢,Bassel),它应该是:

    old_fname = "/a/b/c.hello" 
    new_fname = "/d/e/f"
    
    new_fname += File.extname(old_fname)
    

    【讨论】:

    • 或者,既然我们在谈论字符串,你可以这样做 new_fname += File.extname(old_fname)
    • @Bassel,不会替换 new_fname 的扩展名;它只会将old_fname 的扩展名附加到new_fnane
    • 这就是他想要做的。他不必更换扩展程序,因为他不应该有一个。只需确保新文件名使用旧文件扩展名即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多