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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

503閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1グッド

1クリップ

投稿2019/03/18 02:22

編集2019/03/20 03:12

他のいろいろな人がさわっている 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 するというトップレベルの処理の中で
ログインユーザを取得する部分で本当に最初の最初でおきてるエラーみたいで
他のコントローラーのページを表示しても同じエラーになります

mypt👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ykp_yk

2019/03/19 23:51

まずせめてエラーが出ている該当部分のコードを書きましょう。current_userメソッドの場所でということですが、 `currennt_user` とだけ書いてあることは考えにくいです。 また、エラーは一行だけでは特定しにくいものも多いです。 もう少し全体を共有してください。 > current_user は devise というジェムのヘルパーメソッド deviseを使っているかどうかは確認しているのでしょうか? deviseでなくともヘルパメソッド定義をしている可能性はあります。
退会済みユーザー

退会済みユーザー

2019/03/20 02:07

>まずせめてエラーが出ている該当部分のコードを書きましょう 申し訳ありません 一応コードを追記してみたのですが本当に application の around_action からよばれる最初の最初で current_user しかよんでない状態です (devise がいろいろコールバックをオーバーライドしたりして何か処理してるとは思うのですが) >deviseを使っているかどうかは確認しているのでしょうか? そこも自信がなくて devise ジェムは入っていて devise っぽいメソッドがあちこちにかかれているので使われているものだと思っていますが いかんせんいれたのが自分ではなく個別コントローラーの先しかさわったことがないので どう確認していいかもわからない状態です
guest

回答2

0

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

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

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

投稿2019/03/20 16:11

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/03/22 01:59

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

0

ベストアンサー

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

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

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

投稿2019/03/20 00:50

mypt

総合スコア170

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/03/20 02:03

ありがとうございます Gemfile.lock を調べてみたのですがバージョンは同じでした これまでもエラー内容は違うんですが yield 先のコントローラーのバグが 同じ箇所にでることはあって yield がからんでいるようなのはなんとなくわかっていたのですが 今回は current_user というデバイスのヘルパーで生じていて current_user には引数をわたしていないので current_user を計算する中のどこかでおこっているエラーだと思うのですがジェムの中の話になってくるのでどう追跡すればいいかわからない状態です デバッグ用のジェムなんてあるのですね 順番に試してみようと思います 少ない情報から可能性をあげていただいて本当にありがとうございます
mypt

2019/03/20 14:08

begin current_user rescue => e p e end のようなコードをはさんでみても特定できませんか?
退会済みユーザー

退会済みユーザー

2019/03/22 02:06 編集

ありがとうございます 結論から言うと 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 とかかれていて そのせいでジェムのバージョンは変わっていないと思い込んでしまったのですが なぜ他の人の環境でエラーが起きていないのかはなぞのままですが… 自分だけでは永久に解決できなかったと思うので本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問