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

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

ただいまの
回答率

90.47%

  • Ruby

    7945questions

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

  • Facebook

    407questions

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

  • Devise

    253questions

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

  • WebSocket

    173questions

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

  • Ruby on Rails 3

    100questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,159

Jucky

score 5

環境:

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などを利用する知識が浅いため、分からなくなってしまいました。

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

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

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

  3. オフラインのユーザには、Push通知でも送ることになるのでしょうか。オフラインのユーザが、オンラインになったら、メッセージを取りにこさせるとか、その導線をどうクライアントに組むのかとか、
    サイレントプッシュであらかじめダウンロードさせるとか?ここもいろいろやり方はありかと。

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/07 20:43 編集

    早々のご回答、感謝申し上げます!

    順序立った説明で大変わかりやすく、これからやろうとしていた作業の莫大さがわかりました。他のブロガーさんを見る限り、この作業にはちゃんとしたjavascriptの知識も必要なことが初心者なりにも分かりますし、ベストなのは勉強を継続してしっかりとしたサービス運営など多分野の知識もついた時、改めて挑戦しようと思います。

    恐縮ですが、もう一つ二つ簡単質問よろしければお答えしていただけませんでしょうか?

    仮に、パーソナルな会話板の内部のメッセージ表示可能件数を最新20件程度に限定し・sortingし、
    「更新」ボタンを置いたとして、それを押すことで前回表示時から欠けている新情報を補う。

    また通知に関しては、回答いただいた 3 の【オフラインのユーザには、Push通知を送り、オフラインのユーザが、オンラインになったらメッセージを取りにこさせる】

    といった方法で、簡潔なものを作るのは理屈的に可能でしょうか?
    これも後々継続して手間がかかったり、重い作業になるのでしょうか?


    お手数おかけいたします。

    キャンセル

  • 2016/04/07 20:58

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

    ぜひ、がんばってください。

    キャンセル

  • 2016/04/08 15:16

    >ItoTomonori さん

    そうなのですね。
    掲示板的なプログラムということで、多分これまでの練習で作ったものに似ていると思われるので、挑戦してみようと思います。

    最後までご丁寧にありがとうございました。
    頑張ります。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Ruby

    7945questions

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

  • Facebook

    407questions

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

  • Devise

    253questions

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

  • WebSocket

    173questions

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

  • Ruby on Rails 3

    100questions

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

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