Too many links!!



皆さんこんにちは。

13入社 厄年 年男、管野と申します。


以前こちらで記事を書かせて戴いた際に、次に書かせて戴く時は

「編集長の偉業の数々について熱く語る」という宣言をさせていただいていましたが、
 
事務所からNGが出たので、本日も業務上のあるあるネタを書きます。





突然ですが、以下の表をご覧ください。

 
ext332,000
ext464,000
xfs2,147,483,647


こちらは、各ファイルシステム毎のサブディレクトリ数の上限になります。
(一つのディレクトリ直下に配置できる数。孫ディレクトリ等は含みません。)



次に、下記をご覧ください。

def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end



これはRuby on Railsで一般的に使われる、
「CarrierWave(ファイルのアップロード用ライブラリ)」の、参照先ディレクトリの定義です。
(mounted_as: アップローダがマウントされたカラム名)

同ライブラリをいれると、標準でこのような定義がされ、

uploads/user/icon/1/icon.jpg
uploads/user/icon/2/icon.jpg
.
.
uploads/user/icon/100/icon.jpg
.
.
uploads/user/icon/1000/icon.jpg
.
.
.



のような形でディレクトリが生成、ファイルが保存されます。

























ここまでで、お気づきいただけましたでしょうか?




















そうなんです。




この状態だと、ファイルがアップロードされる度に、
 
/uploads/user/icon/以下にサブディレクトリを作成し続けるので、
 
使用している環境によっては、


Too many links - /[省略]/uploads/user/icon/[id] 



上記のようなエラーが出てディレクトリの作成ができなくなってしまうのです。





今回は、この問題にぶつかってしまったので、一先ず

def store_dir
 "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id.to_s.scan(/.{1,4}/).join('/')}/"
end

のような形で設定変更と、ディレクトリの構成変更を行う事で難を逃れました。







という事で皆様もお気をつけください。









では、次回こそ事務所のOKが出る事を願って。



管野