近工作使用 carrierwave 做上传文件的功能。只是上传文件,比如 word 文件,txt 文件。然后需要有一个列表页面,需要显示上传的文件的名称。比如:上传了一个 goodrails.txt 的文件,需要在列表的第二列显示 文件名称,即 goodrails.txt 要显示出来,让使用者日后查看时,知道上传了什么文件。在 carrierwave 中显示的上传文件名称会存储到 original_filename 中,所以思路就是拿到 original_filename 的值就行了。
carrierwave 中有一个
#def filename
# "something.jpg" if original_filename
# end 方法,大家应该不陌生。就是自定义存入upload文件夹中的文件名称。比如在上传图片时,这样写
(参考大神的文章 http://huacnlee.com/blog/carrierwave-upload-store-file-name-config/)
def filename
if original_filename
@name ||= Digest::MD5.hexdigest(current_path)
"#{@name}.#{file.extension}"
end
通过查看后台传的参数,如 Processing by UpdateFilesController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"hGKDQsOQPBhpEyKDuLhOIOTNDGJ+VlZoNrLblcVNEl1cIXcTh+ePmy46G7ZdfUZlaUZJqsHcIG/ny4WTEo3MRw==", "update_file"=>{"name"=>"", "file_url"=>#, @original_filename="welcome.html.bak.erb", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"update_file[file_url]\"; filename=\"welcome.html.bak.erb\"\r\nContent-Type: application/octet-stream\r\n">, "file_url_cache"=>""}, "commit"=>"提交"}
然后在 modle 写了一个 after_create 回调 代码是这样的:
class UpdateFile < ActiveRecord::Base
mount_uploader :file_url, UpdatefileUploader
after_create :save_filename
def save_filename
self.filename = self.file_url.get_original_filename
self.save
end
end
直接得到 original_filename,存到数据库表里,但是这样报了一个 错误,private method `original_filename' called for #UpdatefileUploader:0x007fdbaddbfc00. original_filename 是私有方法。外部不能调用。 好吧,和同事讨论后。决定在 updatefile-uploader。rb 文件中,写一个 public 的方法,去得到私有的 original-filename 这样
def get_original_filename
return original_filename
end
然后在修改 model 中 after_create 的方法为
def save_filename
self.filename = self.file_url.get_original_filename
self.save
end
ok 顺利通过。 从这个问题也学习到了,如果一个方法或变量是私有的,可以在那个类里面写一个 public 的方法来获得这个方法的返回值或变量 供给外部调用。第一次发帖,经验不足,请大家指正。