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

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

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

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

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Cisco

シスコ(Cisco Systems,Inc.)は、アメリカ合衆国に本社を置く、世界最大のコンピュータネットワーク機器開発会社及び同社の製品

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

971閲覧

railsで1回のテキスト送信でハッシュの値を繰り返し取り出して送りたい

kozica

総合スコア58

Ruby on Rails 5

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

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Cisco

シスコ(Cisco Systems,Inc.)は、アメリカ合衆国に本社を置く、世界最大のコンピュータネットワーク機器開発会社及び同社の製品

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2018/08/31 08:02

Webex TeamsチャットアプリにAPIを使いテキスト送信しようとしたこところで詰まりました。
テキストの出力表示としては下記のようにしたいです。

#理想の出力表示 [8/31 13:21:23] 入室状況           入室者◯名             AA:AA:AA:AA:AA:AAさん(◯時◯分) email:apple@gmail.com              BB:BB:BB:BB:BB:BBさん(◯時◯分)           退室者◯名             CC:CC:CC:CC:CC:CCさん(◯時◯分)             DD:DD:DD:DD:DD:DDさん(◯時◯分) #今までの出力表示 [8/22 11:39:44]AA:AA:AA:AA:AA:AAさんが入室しました email:apple@gmail.com -------------------------------------------------------------- [8/22 11:39:59]BB:BB:BB:BB:BB:BBさんが入室しました -------------------------------------------------------------- [8/22 11:40:00]CC:CC:CC:CC:CC:CCさんが退室しました 滞在時間:5分47秒 -------------------------------------------------------------- [8/22 11:00:00]DD:DD:DD:DD:DD:DDさんが退室しました 滞在時間:1時間13分43秒 -------------------------------------------------------------- 〜現在の入室状況〜 新規入室者:2人 退室者:2人 入室中:23人 --------------------------------------------------------------

ruby

1message = CiscoSpark::Message.new(text:"[timenow] 入室状況\n入室者#{mac_last_count}名\n 2 #{} 3 退室者#{mac_exit.count}名\n 4 #{}") 5room = CiscoSpark::Room.new(id: roomid) 6room.send_message(message)

今までは入室・退室・入室状況と分けてそれぞれに繰り返しメソッドで送ってました。
それを上記のようにして、一回の送信でテキストを送りたいです。
問題は、入室者のAAさんBBさんなど、今まで繰り返しメソッドでハッシュの値を出力していたのを一回のテキストの中に
どう入れればいいかがわかりません。
一度、今までと同様にコードを#{}の中に入れて、#{time_save.each {|x,y| }}と入れてみましたが、eachメソッドが動かず、ただハッシュが表示されてしまいます。

どうやら、#{}の中ではeachメソッドが使えないみたいです。

そこでどう変えたらいいでしょうか??
下記は今までのコードです

ruby

1#入室送信 2#personal_infoはMACアドレスをkeyに,個人情報をValuにしたハッシュ 3#該当MACアドレスに個人情報のデータがあれば付与して出力するようにしている 4time_save.each do |x,z| 5 personal_info = new_data[x].map{|k, v| v.present? ? " #{k} : #{v}": nil} 6 message = CiscoSpark::Message.new(text:"[#{z}] #{x}さんが入室しました\n 7#{personal_info.map(&:to_s).join("\n") }\n--------------------------------------------------------------") 8 room = CiscoSpark::Room.new(id: room_id) 9 room.send_message(message) 10end 11 12#退室送信 13h = {} 14 mac_before.each{ |x| h[x] = (@timenow - Entry.where(macaddr:x).last.time.to_time).to_i} 15 timenow = Time.now.strftime("%m/%d %H:%M:%S") 16 #mac_before_timeは退室者のMACアドレスをKey、滞在時間をValuにしたハッシュ 17 mac_before_time = h.sort_by{|k,v| v}.to_h 18 mac_before_time.each do |k,v| 19 hour = v / 3600 20 minute = v / 60 21 second = v % 60 22 if !(hour == 0) 23 stay = "#{hour}時間#{(v-hour*3600)/60}#{second}秒" 24 elsif !(minute == 0) 25 stay = "#{minute}#{second}秒" 26 else 27 stay = "#{second}秒" 28 end 29 30 message = CiscoSpark::Message.new(text: "[#{timenow}] #{k}さんが退室しました\n 滞在時間:#{stay}\n--------------------------------------------------------------") 31 room = CiscoSpark::Room.new(id: room_id) 32 room.send_message(message) 33 end 34 35#現在の入室状況を送信 36 message = CiscoSpark::Message.new(text:"[#{timenow}] 入室状況\n 37 新規入室者:#{time_save.count}人\n 38 退室者:#{mac_before.count}人\n 39 入室中:#{macaddr_last_count}人\n--------------------------------------------------------------") 40 room = CiscoSpark::Room.new(id: room_id) 41 room.send_message(message) 42 43 44

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

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

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

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

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

guest

回答1

0

一般的に、#{....}の埋め込み文字列の中に複雑な式を書くのは避けるべきです。

ruby

1msg_text = (長い式) 2msg_text << (必要であればさらに追加する) 3 4message = CiscoSpark::Message.new(text: msg_text)

といったように、いったん変数に代入しておいて、それを使うのをおすすめします。
なお、msg_textの組み立てが長くなるのであれば、make_message_textといったメソッドを定義して、

ruby

1msg_text = make_message_text(...) 2message = CiscoSpark::Message.new(text: msg_text)

といったようにメソッドに分解することも検討した方がよいかと思います。

投稿2018/09/05 09:39

takahashim

総合スコア1877

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問