質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.61%

エラー箇所と全く関係ないエラー内容がでる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,425
退会済みユーザー

退会済みユーザー

他のいろいろな人がさわっている develop ブランチをマージしたところ

current_user というメソッドの場所で
wrong number of arguments (3 for 2)
というエラーが出ます

試しにエラーの場所の前に
puts current_user
という行をはさんでみたら同じエラー内容の場所がそっちに移動しました

調べたところ current_user は devise というジェムのヘルパーメソッドのようで、
マージ前は出ていなかったし自分はユーザ関連やデバイス関連をさわっていないので、
他の人の修正が原因だと思うのですが、
チームに聞いてみても他の人のローカル環境では発生していないようで、
自分で調べなければいけなくなりました

current_user 自体は引数なしで呼んでいるので
あきらかに別の場所でエラーが起こっていると思うのですが
Rails って度々エラー内容とエラーを出す場所が食い違うことがあって
なぜこういうことがおこるのでしょうか…

先日も carrierwave の中で wrong number of arguments があったのですが
なぜか save メソッドの中で表示されていて
catrrierwave の中を自分がさわっていたので原因がわかったのですが
devise は自分がいれたわけではないのでどこを見ればいいのか全くわかりません

せめて wrong number of arguments (3 for 2) を
起こしているメソッド箇所を特定する方法はないものでしょうか

追記:

他にもメソッドはいろいろあるのですが関係ありそうなコードはこれだけです
そもそもこのファイル自体は数ヶ月変更されていなくて
いままでも yield 先の各コントローラーで出たエラーが set_time_zone の箇所で出ることが度々あって
エラーメッセージの中身で予想ができてたのですが
今回の場合メッセージからでは該当箇所が推測できないため
どうデバッグすればいいのかわからず困っています

class ApplicationController < ActionController::Base
  around_action :set_time_zone

  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  # protect_from_forgery with: :exception
  protect_from_forgery with: :null_session

  protected
  def set_time_zone
    if user_signed_in? && current_user.time_zone.present?
      gon.user_time_zone = ActiveSupport::TimeZone.zones_map[current_user.time_zone].tzinfo.identifier
      Time.use_zone(current_user.time_zone) { yield }
    else
      yield
    end
  end
  def set_time_zone
    puts current_user
    if user_signed_in? && current_user.time_zone.present?

とかくと puts current_user の箇所にエラーが移動します

これがエラー画面になります

エラー画面

処理としてはログインユーザごとにタイムゾーン情報を保持していて
そのタイムゾーンをセットした上で個別のコントローラーに処理を yield するというトップレベルの処理の中で
ログインユーザを取得する部分で本当に最初の最初でおきてるエラーみたいで
他のコントローラーのページを表示しても同じエラーになります

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ykp_yk

    2019/03/20 08:51

    まずせめてエラーが出ている該当部分のコードを書きましょう。current_userメソッドの場所でということですが、 `currennt_user` とだけ書いてあることは考えにくいです。
    また、エラーは一行だけでは特定しにくいものも多いです。
    もう少し全体を共有してください。

    > current_user は devise というジェムのヘルパーメソッド
    deviseを使っているかどうかは確認しているのでしょうか?
    deviseでなくともヘルパメソッド定義をしている可能性はあります。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/03/20 11:07

    >まずせめてエラーが出ている該当部分のコードを書きましょう
    申し訳ありません
    一応コードを追記してみたのですが本当に application の around_action からよばれる最初の最初で
    current_user しかよんでない状態です
    (devise がいろいろコールバックをオーバーライドしたりして何か処理してるとは思うのですが)

    >deviseを使っているかどうかは確認しているのでしょうか?
    そこも自信がなくて devise ジェムは入っていて
    devise っぽいメソッドがあちこちにかかれているので使われているものだと思っていますが
    いかんせんいれたのが自分ではなく個別コントローラーの先しかさわったことがないので
    どう確認していいかもわからない状態です

    キャンセル

回答 2

+2

エラー画面のFull Traceをクリックすることで

app/controllers/application_controller.rb:56:in `set_time_zone'

より上に表示されるソースが出てきませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/22 10:59

    ありがとうございます
    それだけでよかったのですね…
    次から同じようなケースではまらずに済みそうです

    こちらのほうが汎用的で簡単な方法でなのですが
    一応回答が早かったのと今回のケースで的確に原因を指摘していただいたので
    先に回答いただいた方にベストアンサーは入れさせていただきます
    申し訳ありません

    キャンセル

checkベストアンサー

+1

具体的なコードがないので何ともいえないんですが
devise 関係はバージョンで引数の数がかわることがあるので
動いていたときとジェムのバージョンがかわっていないかチェックしてみては

yield が絡むと yield 先のエラーが yield もとのメソッド内で表示されることはよくあります
暗黙に省略されているブロック引数をたどってその中のコードをみてみるのもありかも

あとはこの辺を参考にデバッグ用のジェムなどをいれてみてはいかがでしょう
https://qiita.com/TakeshiFukushima/items/4e4cf281a3c7495f91e4

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/20 11:03

    ありがとうございます
    Gemfile.lock を調べてみたのですがバージョンは同じでした

    これまでもエラー内容は違うんですが yield 先のコントローラーのバグが
    同じ箇所にでることはあって yield がからんでいるようなのはなんとなくわかっていたのですが
    今回は current_user というデバイスのヘルパーで生じていて
    current_user には引数をわたしていないので current_user を計算する中のどこかでおこっているエラーだと思うのですがジェムの中の話になってくるのでどう追跡すればいいかわからない状態です

    デバッグ用のジェムなんてあるのですね
    順番に試してみようと思います
    少ない情報から可能性をあげていただいて本当にありがとうございます

    キャンセル

  • 2019/03/20 23:08

    begin
    current_user
    rescue => e
    p e
    end

    のようなコードをはさんでみても特定できませんか?

    キャンセル

  • 2019/03/22 10:50 編集

    ありがとうございます
    結論から言うと devise ジェムのバージョンのせいでした
    一番最初に指摘していただいていたのに調べ方が足りず申し訳ありません

    教えていただいたコードを挟んでみたところ
    wrong number of arguments (3 for 2)` in `serialize_from_cookie`

    となったので検索してみるとどんぴしゃでこれだったみたいで
    https://github.com/plataformatec/devise/issues/3974

    >I'm happy to inform you, that an update to devise 3.5.6 resolved the issue!
    3.5.2 で動いていたので
    gem 'devise', '~> 3.5.6'
    とかいたところ動くようになりました

    ただ develop ブランチ自体は Gemfile.lock に devise 3.5.2 とかかれていて
    そのせいでジェムのバージョンは変わっていないと思い込んでしまったのですが
    なぜ他の人の環境でエラーが起きていないのかはなぞのままですが…

    自分だけでは永久に解決できなかったと思うので本当にありがとうございました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る