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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

解決済

1回答

1686閲覧

NoMethodError: undefined method `each'エラーでupdateできない

yamady

総合スコア176

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2018/10/11 01:28

いつもお世話になっております。

Google APIを使って、カレンダー登録を行ないたいと考えているのですが
下記のエラーが生じてしまい次に進むことができません。

具体的には、認証時に取得したgoogle-api-tokenと名付けたレコードをclientに挿入しようと試みているのですがうまくいっていないという状況です。

参考URL:
https://qiita.com/yosidadada/items/083a05c8e4465baee98e

NoMethodError: undefined method `each' for #<String:0x00007fd25059bb70> from /Users/sy/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/signet-0.10.0/lib/signet/oauth_2/client.rb:1182:in `deep_hash_normalize'

ソースコードは下記のイベント登録時に呼ぶ際に起きているアクションとなります。

ruby

1 def create_event 2 client = Signet::OAuth2::Client.new(CLIENT_OPTIONS) 3 binding.pry 4  # ここでエラーがおきる(updateできない) 5 client.update!(user.google_api_token) 6 service = Google::Apis::CalendarV3::CalendarService.new 7 service.authorization = client 8 service.insert_event(user.calendar_id, calendar_event) 9 rescue Google::Apis::AuthorizationError 10 refresh_token 11 retry 12 end

clientの中身は取れています。

@additional_parameters={:prompt=>"consent"}, @authorization_uri=#<Addressable::URI:XXXXXXXXXXXXXXXXXXX URI:https://accounts.google.com/o/oauth2/auth>, @client_id="XXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com", @client_secret="XXXXXXXXXXXXXXXXXXX", @code=nil, @expires_at=nil, @expiry=60, @extension_parameters={}, @issued_at=nil, @issuer=nil, @password=nil, @principal=nil, @redirect_uri=#<Addressable::URI:XXXXXXXXXXXXXXXXXXX URI:XXXXXXXXXXXXXXXXXXX>, @scope=["https://www.googleapis.com/auth/calendar"], @state=nil, @token_credential_uri=#<Addressable::URI:XXXXXXXXXXXXXXXXXXX URI:https://www.googleapis.com/oauth2/v4/token>, @username=nil>

user.google_api_tokenの中身も取れています。

=> "{\n \"access_token\": \"XXXXXXXXXXXXXXXXXXXXXXXXXXXXX\",\n \"expires_in\": 3600,\n \"refresh_token\": \"4/XXXXXXXXXXXXXXXXXXXXXXXXXXXXX\",\n \"scope\": \"https://www.googleapis.com/auth/calendar\",\n \"token_type\": \"Bearer\"\n}"

Qiita記事と異なるのが、Qiita記事が下記のテキスト形式で取得しているのに対して、私はjson形式で保存しています。
これが原因となっているのでしょうか。

Qiita記事

Ruby

1--- 2 access_token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 3 expires_in: 3600 4 refresh_token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 5 scope: https://www.googleapis.com/auth/calendar 6 token_type: Bearer

こちらの環境

{ "access_token": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "expires_in": 3600, "refresh_token": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "scope": "https://www.googleapis.com/auth/calendar", "token_type": "Bearer" }

また、Userモデルもエラーが出てしまうため一部変更しています。

serialize :google_api_token, Hash

上記を排除しています。

すみませんが、ご助言いただければと思います!

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

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

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

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

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

guest

回答1

0

ベストアンサー

公式ドキュメントの使用例を確認しましょう。

https://www.rubydoc.info/github/google/signet/Signet/OAuth2/Client#update!-instance_method

Hashの値を渡していますよね? user.google_api_token が文字列なので問題が発生しているんだと思います。

投稿2018/10/11 01:32

mather

総合スコア6753

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

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

yamady

2018/10/11 03:29

ありがとうございます!ハッシュ値を渡したら通過することができました(_ _)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問