上传后重命名文件名

时间:2011-12-27 20:38:15

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

我想使用paperclip上传一个mp3文件,我想在上传后在文件上添加一个扩展名,就像这首歌的名字是“just dance.mp3”,我想把它重命名为“just dance.mp3” (www.hypejamz.com)“我的歌曲模型中有这段代码

after_create :normalize_song

  Paperclip.interpolates :normalized_mp3_file_name do |attachment, style|
    attachment.instance.normalized_mp3_file_name
  end

  def normalized_mp3_file_name
    "#{self.mp3_file_name.gsub( /[^a-zA-Z0-9_\.]/, ' ')}#{'(www.hypejamz.com)'}"
  end

  def normalize_song
    self.update_attributes(:mp3_file_name => normalized_mp3_file_name, :name => "#{self.title} by #{self.user.name}")
  end

如果我这样做,文件输出是“just dance.mp3(www.hypejamz.com)(www.hypejamz.com)”  但我希望输出“只是dance.mp3(www.hypejamz.com)”。谢谢

3 个答案:

答案 0 :(得分:2)

以下是一个涵盖您所询问的字符串修改的规范,以及一些使其通过的代码。

require 'rspec'

class SongUpload
  attr_accessor :file_name

  def initialize(file_name)
    @file_name = file_name
  end

  def normalized_mp3_file_name
    @file_name + "(www.hypejamz.com)"
  end
end


describe SongUpload do
  before(:each) do
    @upload = SongUpload.new("just dance.mp3")
  end

  context "#normalized_mp3_file_name" do
    it "should append the string (www.hypejamz.com) to the file_name" do
      @upload.normalized_mp3_file_name.should eq "just dance.mp3(www.hypejamz.com)"
    end
  end  
end

我几乎肯定这不是你想要的,但它提供了一个基础。

答案 1 :(得分:1)

根据我的理解,当您使用插值时,当您在数据库中检索文件名时,它会将(www.hypejamz.com)附加到文件的路径或URL。

当您使用“(www.hypejamz.com)”附加到数据库中的文件名时更新文件名,同时在插入“(www.hypejamz.com)”时使用url或paperclip的路径方法检索文件再次附加到文件名。

建议不要更新update_attributes中的file_name

  def normalize_song
    self.update_attributes(:name => "#{self.title} by #{self.user.name}")
  end

答案 2 :(得分:0)

我想这就是你所需要的,这是一种你可以做到的一种小小的hackish方式。

before_save :change_mp3_file_name

def change_mp3_file_name
    if !self.mp3_file_name.nil?
      self.mp3.instance_write(:file_name, "#{self.mp3_file_name}(www.hypejamz.com)")
    end
end

这将保存文件名,并将“(www.hypejamz.com)”附加到文件本身,并将以相同的方式检索。