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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

3回答

5360閲覧

JSONをeachで回して表示したい

Takuma_Tanaka

総合スコア128

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2016/04/26 09:24

編集2016/04/26 10:00

見ていただいてありがとうございます。
Google+の自分の投稿を他のサイトに表示したいと考えています。
そこで自分の投稿の詳細を取得してeachで回して最新の9件を表示しようとしているのですが、以下のエラーが出て表示されません。

undefined method `items' for ["kind", "plus#activityFeed"]:Array

Controller

class HogeController < ApplicationController require 'google/api_client' require 'json' def index client = Google::APIClient.new( application_name: 'Example Ruby application', application_version: '1.0.0' ) client.key = "**************************" client.authorization = nil result = client.execute( api_method: client.discovered_api(:plus).activities.list, parameters: { collection: "public", userId: ***************** } ) @users = result.data.to_json end end

index.html.erbのソース

<center> <div style="width:930px;"> <% @users.first(9).each do |user| %> <div style="float:left;width: 300px;height: 400px;margin:3px; border: 2px solid blue; "> <% link = user.items.url %> <% name = user.items.actor.displayName %> <% coment = user.items.title %> <% img = user.items.object.attachments %> <%= link_to name, @admin.instagrams_url, :target=>["_blank"] %><br> <%= coment %><br> <%= link_to image_tag(img, :class => "img- rounded" ), @admin.instagrams_url, :target=>["_blank"] %> </div> <% end %> <br clear="both"/> </div> </center>

試しにindex.html.erbを「<%= @users %>」だけにしたところ以下のJSONを取得できていました。

{ "kind": "plus#activityFeed", "etag": "\"4OZ_Kt6ujOh1jaML_U6RM6APqoE/_0SmOsuNO4HJllkV83exN-HCnKc\"", "title": "Google+ List of Activities for Collection PUBLIC", "updated": "2016-04-26T04:34:20.759Z", "items": [ { "kind": "plus#activity", "etag": "\"4OZ_Kt6ujOh1jaML_U6RM6APqoE/GE9BFTCcw-pt7iSspiBt9oy23lc\"", "title": "信じられないだろ・・・\nこれでグミなんだぜ・・・\n\n#グミ\n#クマ", "published": "2016-04-26T04:34:20.759Z", "updated": "2016-04-26T04:34:20.759Z", "id": "z13my3toswewyzxks220eporttighvqd0", "url": "https://plus.google.com/114624284244149933026/posts/5Aqgjf5owKA", "actor": { "id": "114624284244149933026", "displayName": "田中琢磨", "url": "https://plus.google.com/114624284244149933026", "image": { "url": "https://lh5.googleusercontent.com/-Vy7vaAD81i0/AAAAAAAAAAI/AAAAAAAAABE/mnXdlb-q2VM/photo.jpg?sz=50" }, "verification": { "adHocVerified": "UNKNOWN_VERIFICATION_STATUS" } }, "verb": "post", "object": { "objectType": "note", "actor": { "verification": { "adHocVerified": "UNKNOWN_VERIFICATION_STATUS" } }, "content": "信じられないだろ・・・\u003cbr /\u003eこれでグミなんだぜ・・・\u003cbr /\u003e\u003cbr /\u003e\u003ca rel=\"nofollow\" class=\"ot-hashtag\" href=\"https://plus.google.com/s/%23%E3%82%B0%E3%83%9F\"\u003e#グミ\u003c/a\u003e\u003cbr /\u003e\u003ca rel=\"nofollow\" class=\"ot-hashtag\" href=\"https://plus.google.com/s/%23%E3%82%AF%E3%83%9E\"\u003e#クマ\u003c/a\u003e\ufeff", "url": "https://plus.google.com/114624284244149933026/posts/5Aqgjf5owKA", "replies": { "totalItems": 0, "selfLink": "https://www.googleapis.com/plus/v1/activities/z13my3toswewyzxks220eporttighvqd0/comments" }, "plusoners": { "totalItems": 0, "selfLink": "https://www.googleapis.com/plus/v1/activities/z13my3toswewyzxks220eporttighvqd0/people/plusoners" }, "resharers": { "totalItems": 0, "selfLink": "https://www.googleapis.com/plus/v1/activities/z13my3toswewyzxks220eporttighvqd0/people/resharers" }, "attachments": [ { "objectType": "photo", "displayName": "信じられないだろ・・・\nこれでグミなんだぜ・・・\n\n#グミ\n#クマ", "id": "114624284244149933026.6277718594201482882", "content": "kumagumi.jpg", "url": "https://plus.google.com/photos/114624284244149933026/albums/6277718590126254161/6277718594201482882", "image": { "url": "https://lh3.googleusercontent.com/-9bBbRZogmFI/Vx7vzPc-doI/AAAAAAAAAHc/fo-PF1nHTl8q18HOTMQBoU1TGctzA2b7A/w506-h750/kumagumi.jpg", "type": "image/jpeg" }, "fullImage": { "url": "https://lh3.googleusercontent.com/-9bBbRZogmFI/Vx7vzPc-doI/AAAAAAAAAHc/fo-PF1nHTl8q18HOTMQBoU1TGctzA2b7A/w960-h592/kumagumi.jpg", "type": "image/jpeg", "height": 592, "width": 960 } } ] }, "provider": { "title": "Google+" }, "access": { "kind": "plus#acl", "description": "Public", "items": [ { "type": "public" } ] } }, { "kind": "plus#activity", "etag": "\"4OZ_Kt6ujOh1jaML_U6RM6APqoE/ic0vNiJnuEuZ1k0x1ipIbaXYGS0\"", "title": "灯台だけど、ちょっとお城っぽいね\n#灯台\n#夕焼け", "published": "2016-04-26T04:32:59.132Z", "updated": "2016-04-26T04:32:59.132Z", "id": "z12xs1tanzijtheez220eporttighvqd0", "url": "https://plus.google.com/114624284244149933026/posts/Gwju3YpRCYS", "actor": {

初歩的なミスかと思うのですが、何が原因か分かりません。
どなたかご教示お願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

コードとエラーメッセージが一致してないように思います。このコードだと @users.first(9)がNoMethodErrorになるはずなのですが。

  • コントローラで@users = result.data.to_jsonとしていますが#to_jsonでJSON文字列に変換するのをやめる
  • ビューの側でループを @users.items.first(9).each ...にする
  • 個々のデータへのアクセスは user.title user.url などとする

で動くんじゃないでしょうか。

  • 変数名がおかしい(Activityを取得しているのに何故 @users userなのか)
  • 取得したあとに#firstなどで件数を制限するのではなく、APIで取得する件数を指定したほうがよい
  • google-api-ruby-client のバージョンが古いのであとのことを考えると0.9系にした方がよい

なども見直した方が良いと思います。

投稿2016/04/27 02:40

suzukis

総合スコア1449

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

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

Takuma_Tanaka

2016/04/27 03:35

ご回答ありがとうございます。 ご教授頂いた通り、JSON変換をやめ、ビューのループを修正し、データのアクセスも修正したところ該当のエラーは出ず、ループが動作し始めました。 ●変数名が分かりにくい点について「user」を「item」に変更しました。 ●APIで取得する時点で件数を指定する方法が分からず横着してしまいました。  調べて取得件数を指定するようにします。 ●google-api-ruby-clientについては参考にしたサイトが0.8系だったので、  そのまま使用していました。  動作確認が取れてから0.9系に変更します。 お陰さまでループは動き始めたものの画像データのみが正常に取得できない状態です。 viewを ``` <% img = item.object.attachments[0].image.url %> <% if img then %> <%= link_to name, "http://localhost:3000", :target=>["_blank"] %><br> <%= coment %><br> <%= link_to image_tag(img, :class => "img- rounded" ), "http://localhost:3000", :target=>["_blank"] %> ``` にしたところ「undefined method `image' for nil:NilClass」になり、 ``` <% img = item.object.attachments[0] %> <% if img then %> <%= link_to name, "http://localhost:3000", :target=>["_blank"] %><br> <%= coment %><br> <%= link_to image_tag(img.image.url, :class => "img- rounded" ), "http://localhost:3000", :target=>["_blank"] %> ``` にすると「undefined method `url' for nil:NilClass」 ``` <% img = item.object.attachments[0].image %> <% if img then %> <%= link_to name, "http://localhost:3000", :target=>["_blank"] %><br> <%= coment %><br> <%= link_to image_tag(img.url, :class => "img- rounded" ), "http://localhost:3000", :target=>["_blank"] %> ``` にすると「undefined method `image' for nil:NilClass」 ``` <% img = item.object.attachments.image %> <% if img then %> <%= link_to name, "http://localhost:3000", :target=>["_blank"] %><br> <%= coment %><br> <%= link_to image_tag(img.url, :class => "img- rounded" ), "http://localhost:3000", :target=>["_blank"] %> <% else %> ``` にすると「undefined method `image' for #<Array:0x007f5a34c9bc20>」になります。 画像がない時はテキストのみを表示しようとしているのですが、そもそも画像データが取れない状態なので、再度ご教授お願いします。
suzukis

2016/04/27 04:31

場当たり的に変更していたのではうまく行かなくても仕方ないでしょう。データ全体の構造とレコードごとの違い、どういうアクセスの仕方をしたらどういうデータが取れるのか、レコードごとの要素のあるなしをどう区別するか、思ったデータが取れないとかエラーが出たのであればそれはなぜか、を考えながら試してください。コメントに書かれてる内容だけではどういうデータに対してどこでエラーが出たのか追いかけるのが面倒なので自分でもう少し考えてみてください。
Takuma_Tanaka

2016/04/27 05:32

ご回答ありがとうございます。 色々試したり、調べたりしたのですが、どうしても画像だけが取得できなかったので再度質問させて頂きました。 調べ方が悪いかもしれないので、色々調べてみます。 ありがとうございました。
guest

0

<% @users.first(9).each do |user| %> <%= user %> <% end $>

して user の内容をチェックするとよいとおもいます。
user.items.url といったアクセスが可能な内容にはなっていないはずです。

投稿2016/04/26 15:19

katoy

総合スコア22324

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

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

Takuma_Tanaka

2016/04/27 00:25

ご回答ありがとうございます。 試してみたところ「undefined method `each' for "{\"kind\":\"":String」エラーになりました。 first(9)を外しても同様のエラーだったということは「@users」に何か原因があるのでしょうか?
guest

0

Ruby全く知らないのですが、itemsが定義されてないよ、というエラーに見受けられます。
試しにレスポンスJSONのuser/itemsの中身を変数に突っ込んでみるのはいかがでしょうか?
それで同じエラーがかえるのであれば何かもう1ステップ必要な気がしています。

全く知らないのに差し出がましくて申し訳ありません。

投稿2016/04/26 14:24

shotakeu

総合スコア386

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

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

Takuma_Tanaka

2016/04/27 00:29

ご回答ありがとうございます。 もしかしたら間の1ステップとして取得したJSONを一括包括したらできるのかもしれませんが方法が分かりません。 原因を考えてくれてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問