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

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

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

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

Q&A

解決済

2回答

247閲覧

rubyで出力結果が違うものになる

kozica

総合スコア58

Ruby

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

0グッド

0クリップ

投稿2018/08/15 08:17

編集2018/08/16 01:25

Sparkというチャットアプリに文字を出力するシステムを作っております。
ダブルクォートのなかにrubyの出力結果を表示したいとき
結果の上2つをだしたいのですがどうすればいいのでしょうか?

調べてみると、評価結果?が表示されているようです

ruby

1 2macaddr.each do |x| 3 personal_info = new_data[x] 4 message = CiscoSpark::Message.new(text:"#{x}さんが入室しました\n #{persoanl_info}\n--------------------------------") 5 room = CiscoSpark::Room.new(id: room_id) 6 room.send_message(message) 7end 8 9#Sparkチャットアプリの出力結果 10〇〇さんが入室しました 11{"phone"=>"09058342", "uid"=>"2342,67423,6XR423", "email"=>"apple@gmail.com"} 12----------------------------------------- 13 14#理想の結果 15〇〇さんが入室しました 16 phone => 09058342 17 uid => 2342,67423,6XR423 18 email => apple@gmail.com 19----------------------------------------- 20〇〇さんが入室しました 21 phone => 09058542 22 uid => 2342,67423,6XR423 23 email => orenge@gmail.com 24

理想の結果の出力を得るためにはどのようにコーディングすればよいでしょうか?

###試したこと

ruby

1macaddr.each do |x| 2 personal_info = new_data[x] 3 message = CiscoSpark::Message.new(text:"#{x}さんが入室しました\n #{persoanl_info.each|k, v| puts "#{k}=>#{v}"}\n--------------------------------") 4 room = CiscoSpark::Room.new(id: room_id) 5 room.send_message(message) 6end

これだと結果が変わりませんでした。
###追記(改善後の出力結果)

ruby

1 2#Sparkチャットアプリの出力結果 3〇〇さんが入室しました 4 email : 53455@gmail.com,345@gmail.com,234@gmail.com,123@gmail.com,apple@gmail.com 6 uid : 6729661727,119841,10013221 7 ---------------------------------------------------------- 8○○さんが入室しました 9 uid : 9968312102,7429432342135,2342457151614629,VGJ234HDFRA 10 email : 11abc@gmail.com,bcd@popchat.jp,cvbasfga@hoge.com,dfasdfasdf@yahoo.co.jp 12 phone : 0803934,0803943 13 ---------------------------------------------------------- 14〇〇さんが入室しました 15 uid : 74290623423461,9963492102,1001234234423 16 email : 345245234@gmail.com 17 ---------------------------------------------------------- 18 19 20#理想の結果 21〇〇さんが入室しました 22 phone => 09058342 23 uid => 2342,67423,6XR423 24 email => apple@gmail.com,orenge@yahoo.co.jp,bunanan@yahoo.co.jp, 25 painappuru@yahoo.co.jp 26----------------------------------------- 27〇〇さんが入室しました 28 phone => 09058542 29 uid => 2342,67423,6XR423 30 email => apple@gmail.com,orenge@yahoo.co.jp,bunanan@yahoo.co.jp, 31 painappuru@yahoo.co.jp

改善後は上記のように、文字が長くなるとズレが出てしまいます。
そうならにように、理想の形のように、phone,uid,emailともに列が揃ってて、それぞれの”=>”も揃えるようにしたいのですが、可能でしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

macaddr.each do |x| personal_info = new_data[x].map{|k, v| v.present? ? "#{k}=>#{v}" : nil} message = CiscoSpark::Message.new(text:"#{x}さんが入室しました\n #{persoanl_info.map(&:to_s).join("\n")} --------------------------------") room = CiscoSpark::Room.new(id: room_id) room.send_message(message) end

みたいにpersonal_info = new_data[x].map{|k, v| "#{k}=>#{v}"}の時点で分けておいて、出力の際に一つずつ取り出すこともできます。冗長にはなりますが。
編集:これで値が存在しない場合にその出力はスキップされます。
文字列の長い場合の表示を云々はヒアドキュメント使ってください。

投稿2018/08/15 08:29

編集2018/08/16 05:21
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kozica

2018/08/15 08:48 編集

すいません。 質問の仕方が悪かったです。 投稿のほうを大幅に編集しました
kozica

2018/08/16 02:05 編集

回答を受けて改善したところ、配列にないものがある場合に下に余白が出来てしまいます。 uid,phone,emailのうちuidしかない場合、配列を[0],[1],[2]と固定で出力しているので存在しないphone,emailの部分が空白になるということです。 できればここは余白を作りたくないので詰めるようには出来ますでしょうか? また、emailやuidだと値が複数あるときがあり、文字列が長くなる場合があります。 そのときの表示として uid : 6643434372808997,3014130258,99683434324392102,1343319841,1001322134234234497 email : ddddddddddddd@gmail.com,ccccccccccccccc@gmail.com,aaaaaaaaaaaaaaaa@gmail.com,xxxxxxxxxxxx@gmail.com と、上記のようになります。 これを投稿追記のところの理想の形のようにしたいです
kozica

2018/08/16 05:08

.join('\n')が表記そのままだったので、.join("\n")に変更して無事うまく動きました! ご丁寧にありがとうございます!
guest

0

eachではなくmapとjoinを用いて変換・合体を行う
ついでに、ヒアドキュメントを用いて読みやすくしてみる

ruby

1macaddr.each do |x| 2 personal_info = new_data[x] 3 message = CiscoSpark::Message.new(text: <<JOIN_MSG.chomp 4#{x}さんが入室しました 5#{persoanl_info.map do |k, v| 6 "#{k}=>#{v}" 7end.join("\n")} 8-------------------------------- 9JOIN_MSG 10 ) 11 room = CiscoSpark::Room.new(id: room_id) 12 room.send_message(message) 13end

ヒアドキュメントなしでなるべく読みやすくしようとすると
処理を分割する事になりますね

ruby

1macaddr.each do |x| 2 personal_info = new_data[x] 3 personal_msg = personal_info.reduce(""){|str, kv| str + kv.join('=>') + "\n"} 4 message = CiscoSpark::Message.new(text:"#{x}さんが入室しました\n #{persoanl_msg}--------------------------------") 5 room = CiscoSpark::Room.new(id: room_id) 6 room.send_message(message) 7end

投稿2018/08/15 08:58

編集2018/08/15 10:12
asm

総合スコア15147

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

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

kozica

2018/08/15 09:08

NameError (undefined local variable or method `message' for #<EventsController:0x00007fd28d819ec8>): 上記エラーが出てしまいました textの中の形式が問題でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問