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

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

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

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

Ruby on Rails 3

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

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Facebook

Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

Q&A

解決済

1回答

2879閲覧

Railsで作ったアプリケーションにFacebookやWantedlyのような直接会話できるメッセージ機能を持たせたい。

Jucky

総合スコア13

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

Ruby on Rails 3

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

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Facebook

Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

0グッド

2クリップ

投稿2016/04/07 10:47

編集2016/04/07 11:22

###環境:
Cloud9
Ruby on rails 4
Github
Heroku

###前提
現在Railsアプリーケーションを作成してHerokuへのデプロイを終えています。
評価機能、フォロー機能、お気に入り機能などの多対対の関係構築などは問題なくこなせます。
APIを使ったサービスの構造がいまいち理解できず、Facebook,TwitterログインなどのAPI周りの作業に苦戦してます。

###実現したいこと
ユーザー登録にDeviseを使用しているのですが、その各ユーザーに紐付いた
プライベートなメッセージ機能をもたいせたいと考えております。

###条件
authenticate_user!が自分のページから
または
送信先ユーザーのページにて
「ダイレクトメッセージ」ボタンを押すことで、送信者として自分の(current_user)idを紐付けたメッセージ空間を作成。
且つ、その空間に保存された内容を観れるのは招待したauthenticate_userと招待されたauthenticate_user!
のみに限定する。

###現在

今は、いろいろ調べてみた結果,Websocket(-rails/Gemfile)やSSE、Pusherなるサービス?があるようで、
試しにPusherで先人方のブログを参考にしながら進めた結果、リアルタイムに更新されるChatルーム作成までは来れました。
ですが、いまいちその構造を掴めていません。
メッセージも一度ページを閉じると消えてしまっています。

ということはもし、上記で述べたような機能を搭載するには、独自にChat ModelやDB上にchatsテーブル・messageカラム:string のように作成し、リレーション構築、DBに保存させる処理のコーディング作業を取らなければいけないということでしょうか?

簡潔にまとめますと、FacebookやWantedlyのような直接会話できるメッセージ機能を持たせるには、
どのような作業が必要になるのか?
です。

まだプログラミングを始めて2か月ほどで、ところどころ分からないところもあり、こう言った外部APIなどを利用する知識が浅いため、分からなくなってしまいました。

どうか、知恵をお貸しください。

回答に必要な情報あれば、すぐに載せます。

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

プログラムをはじめて2ヶ月との事ですので、ちょっと難しいかもしれませんが、、、

まず、よくサンプルである、Websocketを使ったチャットルームは、あるクライアントから送信されたメッセージを、他の接続クライアントへ配信する機能だけのものがほとんどです。
なので、ブラウザ閉じればきえてしまいますし、配信側と、受信側がともにオンラインでないと、メッセージは送受信されません。あくまでも同時オンラインの場合にのみ有効な方法です。

  1. そこで、すでにお気づきのようですが、クライアントから受信したメッセージは、一度サーバ側で、何かしらの方法で蓄積する必要があります。DBでもいいですし、NoSQLでも、ファイルでも、何でもいいですが、蓄積をしておきます。

  2. 次に、クライアントの接続状態を見極めます。オンラインになっているユーザには、メッセージをそのまま配信すればいいですね。

ただ、ここで、面倒なのは、過去のオンライン時に、どこまでクライアントがメッセージを受信したかを管理しないと、重複してメッセージを送ってしまうとか、途中歯抜けになってしまうとか、そのような状態になってしまいます。
どこまで、送信したか履歴を管理するか、毎回全部おくっちゃうとか!(ネットワークに申し訳ない!)まあ、考え方はさまざまです。

  1. オフラインのユーザには、Push通知でも送ることになるのでしょうか。オフラインのユーザが、オンラインになったら、メッセージを取りにこさせるとか、その導線をどうクライアントに組むのかとか、

サイレントプッシュであらかじめダウンロードさせるとか?ここもいろいろやり方はありかと。

  1. そして、またまた面倒な、問題です。複数の端末で、同一アカウントにログインしていたとき(PCとスマホとか)の考慮も必要です。他の端末で閲覧したメッセージは、既読あつかいしないとですね。

  2. さらに、どこまでメッセージ保存しておきましょうか?GoogleやFaceBookのような、莫大な資産があれば、消さないでどこまでも持っておけますが、普通はある程度で消すとかしないと、DBパンクします。では、有料サービスにするのか、とか、、、

  3. そして、最後に一番やっかいな問題です。完璧なプログラムはありません。何かしら不具合はでるものです。さて、チャットのようなプログラム作りました、リリースしました。運用はどうするか、結構きめておかないと、大変なことになります。24時間、誰が監視するのか?また、どの程度のユーザ数を見込むのかなどによって、サーバの構成やら、なんやら、スケーラビリティー、云々・・・。

っと、つらつらと書きましたが、
正直、かなり大がかりな仕事になることが予想されます。

ここに、こんな感じのサンプルあるよ、とか、こんな感じで書いてみれば、と簡単にできることではありませんので、、、

もし、本気ではじめるなら、覚悟して取りかかってください。
また、もしかしたらチャットエンジンのようなサービスを提供しているサイトとかあるかも?なので、そのあたりにおんぶに抱っこが現実的かもしれません。

投稿2016/04/07 11:16

ItoTomonori

総合スコア1283

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

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

Jucky

2016/04/07 11:45 編集

早々のご回答、感謝申し上げます! 順序立った説明で大変わかりやすく、これからやろうとしていた作業の莫大さがわかりました。他のブロガーさんを見る限り、この作業にはちゃんとしたjavascriptの知識も必要なことが初心者なりにも分かりますし、ベストなのは勉強を継続してしっかりとしたサービス運営など多分野の知識もついた時、改めて挑戦しようと思います。 恐縮ですが、もう一つ二つ簡単質問よろしければお答えしていただけませんでしょうか? 仮に、パーソナルな会話板の内部のメッセージ表示可能件数を最新20件程度に限定し・sortingし、 「更新」ボタンを置いたとして、それを押すことで前回表示時から欠けている新情報を補う。 また通知に関しては、回答いただいた 3 の【オフラインのユーザには、Push通知を送り、オフラインのユーザが、オンラインになったらメッセージを取りにこさせる】 といった方法で、簡潔なものを作るのは理屈的に可能でしょうか? これも後々継続して手間がかかったり、重い作業になるのでしょうか? お手数おかけいたします。
ItoTomonori

2016/04/07 11:58

規模を小さくして、最大20件程度ということであれば、DBでゴリゴリ書いても、なんとかなってしまうでしょうから、ぜひチャレンジされるとよいかと思います。 その場合には、いわゆる昔の「掲示板」的なプログラムになると思います、こちらは結構サンプルなどあるのではないかと思います。 ぜひ、がんばってください。
Jucky

2016/04/08 06:16

>ItoTomonori さん そうなのですね。 掲示板的なプログラムということで、多分これまでの練習で作ったものに似ていると思われるので、挑戦してみようと思います。 最後までご丁寧にありがとうございました。 頑張ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問