20517


`CarrierWave`のuploaderを持つ`Voice`というモデルがあり

[code]

    class Voice < ActiveRecord::Base
      mount_uploader :sound, SoundUploader
    end
    
[/code]

これにファイルのアップロードは正常に行えたようなのですが、`CarrierWav::SanitizedFile`の`@original_filename`の扱いがよくわかりません。

[code]

    pry(main)> voice.sound.file
    => #<CarrierWave::SanitizedFile:0x007f94cbfc4d58
     @content_type="audio/x-wav",
     @file="/Users/ironsand/dev/nativephrase/public/uploads/voice/sound/21/something.wav",
     @original_filename=nil>
    
[/code]

と`@original_filename`が`nil`になってるにもかかわらず

[code]

    pry(main)> voice.sound.file.original_filename
    => "something.wav"
    
[/code]

のように値が取得できます。

ここで呼び出してるのがインスタンスメソッドではなく`original_filename`というメソッドだと言うことはわかったのですが、インスタンス変数の`@original_filename`が`nil`のままにされているのかよくわかりませんでした。

何か`nil`のままにしておくことで利点があるのでしょうか？


CC BY-SA 3.0
2015-12-31T21:11:47.190
20516
2016-01-01T01:02:22.733
3271
question
ruby-on-rails carrierwave
CarrierWave::SanitizedFileの @original_filename の扱いについて


`nil` にしておくことに利点があるのではなく、  
ファイルをアップロードするときに使っているだけである、と推察できます。  
ファイルがストレージにあるときは、そこからファイル名が取得できるので、`nil`なのではないかと。

[code]

    def file=(file)
      if file.is_a?(Hash)
        @file = file["tempfile"] || file[:tempfile]
        @original_filename = file["filename"] || file[:filename]
        @content_type = file["content_type"] || file[:content_type] || file["type"] || file[:type]
      else
        @file = file
        @original_filename = nil
        @content_type = nil
      end
    end
    
[/code]

<https://github.com/carrierwaveuploader/carrierwave/blob/master/lib/carrierwave/sanitized_file.rb#L288-L298>

ただ、実行時に一時的にファイル名を書き換えることに使えそうだ、とは思います。


CC BY-SA 3.0
2016-01-01T01:02:22.733
20517
2016-01-01T01:02:22.733
7471
20516
answer