3

私は奇妙な問題を抱えており、さらにデバッグする方法はありません...

htmlフォームを使用してファイルをアップロードすると、次のようになります。

SystemStackError (stack level too deep):

トレースは次のとおりです。

Started POST "/global/accounts/82" for 127.0.0.1 at 2011-07-27 10:28:03 +0200
  Processing by Global::AccountsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"tAf/cGPjW+uGgdl6J7t+IZgGsNKkVDLCCWYMFdtQd7g=", "account"=>{"logo_cache"=>"", "shortcut_icon"=>#<ActionDispatch::Http::UploadedFile:0x0000010632daa0 @original_filename="18677_265409985796_708130796_4889342_5500573_n.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"account[shortcut_icon]\"; filename=\"18677_265409985796_708130796_4889342_5500573_n.jpg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<File:/tmp/RackMultipart20110727-3683-1yazc7m>>, "shortcut_icon_cache"=>""}, "commit"=>"Einstellungen speichern", "member"=>{"cancel"=>:get}, "id"=>"82"}
  User Load (1.1ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 261 LIMIT 1
  Account Load (0.8ms)  SELECT `accounts`.* FROM `accounts` WHERE `accounts`.`id` = 82 LIMIT 1
  SQL (2.0ms)  describe `roles_users`
  Role Load (3.8ms)  SELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON `roles`.id = `roles_users`.role_id WHERE `roles`.`name` = 'admin' AND (`roles_users`.user_id = 261 ) LIMIT 1
  Account Load (1.9ms)  SELECT `accounts`.* FROM `accounts` WHERE `accounts`.`subdomain` = '***' LIMIT 1
  SQL (0.2ms)  BEGIN
  SQL (0.6ms)  SELECT 1 FROM `accounts` WHERE (LOWER(`accounts`.`subdomain`) = LOWER('***')) AND (`accounts`.id <> 82) LIMIT 1
  AREL (0.5ms)  UPDATE `accounts` SET `shortcut_icon` = 'aadf09e05f4db4124c62bfb9340aa9bd.jpg', `updated_at` = '2011-07-27 08:28:08' WHERE `accounts`.`id` = 82
  Account Load (0.5ms)  SELECT `accounts`.* FROM `accounts` WHERE `accounts`.`id` = 82 LIMIT 1
  SQL (1.2ms)  ROLLBACK
Completed   in 2831ms

SystemStackError (stack level too deep):

トレースを分析すると、ファイルがアップロードされ、DBに書き込まれているようです。

 AREL (0.5ms)  UPDATE `accounts` SET `shortcut_icon` = 'aadf09e05f4db4124c62bfb9340aa9bd.jpg', `updated_at` = '2011-07-27 08:28:08' WHERE `accounts`.`id` = 82

しかしその後、エラーがスローされます。

Railsコンソールでのcarrierwaveのテスト:

ruby-1.9.2-p180> path = "/Users/kalle/Desktop/button.png"
ruby-1.9.2-p180> u = Account.last
ruby-1.9.2-p180> u.logo = File.open(path)
 => #<File:/Users/kalle/Desktop/button.png> 
ruby-1.9.2-p180> u.save!
 => true 

正常に動作します!

さて、私は別のモデルでファイルをアップロードしているので、carrierwaveのインストールは正常に機能します(同様のアップローダー)。

ファイルを提出せずにhtmlフォームをテストすると、正常に機能します。

それで:

  • フォームはファイルフィールドなしで機能します
  • carrierwaveファイルのアップロードはコンソールで機能します
  • 別のモデル、同様の搬送波アップローダー/構成=>動作します!

どうすればさらにデバッグできますか?

助けてくれてありがとう!

Rails 3.0.7 / ruby​​-1.9.2-p180 /carrierwave(0.5.3)

編集:それは更新アクションでのみ発生するようです。

コントローラ:

def update
  if current_account.update_attributes(params[:account])
    flash[:notice] = 'Successfully updated account.'
    redirect_to global_settings_path
  else
    render :action => 'edit'
  end
end
4

1 に答える 1

1

同様の問題がありました。photo.url を呼び出すと、「スタック レベルからディープ エラー」がスローされました。

PhotoUploader に次のコードがあるようです。

  デフォルト URL
    ファイル名 = self.to_s
    content_type = File.mime_type?(ファイル名)    
    ext = {
      '画像/png' => :png,
      '画像/jpg' => :jpg,
      '画像/jpeg' => :jpg,
      'image/gif' => :gif

    }[コンテンツタイプ]
    内線 ||= :jpg

    { :id => model.id, :version => version_name, :format => ext }    
  終わり

このコードは、carrierwave 0.5.8 で正常に動作するように見えました。0.6.2 に更新しましたが、失敗したためです。

問題は、self.to_s を呼び出していることです。Carrierwave コードでわかったように、to_s は次のように実装されています。

  デフォルト to_s
    URL || ''
  終わり

self.to_s を self.file に変更することで、問題は解決しました

  デフォルト URL
    ファイル名 = self.file
    # ... コードの残りの部分 ..
  終わり
于 2012-05-22T04:45:24.503 に答える