在Rails中实现Pusher Chat并实现

时间:2018-01-27 22:06:58

标签: ruby-on-rails ruby pusher

我正在使用此repo在Rails中的2个用户之间创建聊天系统并对项目做出反应。我已经能够将用户输入记录到控制台中,并且我已根据repo创建了messages_controller和message_threads_controller。

但是,我无法将消息持久保存到rails db,然后在将用户发送给Pusher之前使用Pusher对用户进行身份验证。主要是因为在将消息发送到rails时,from_uid,to_uid和thread_uid不存在。 将消息发送到这样的rails:

sendMessage = (event) => {
    event.preventDefault();
    const {message} = this.state;
    axios.post('/api/v1/messages', {message: message})
        .then((response) => {
            console.log(response);
        })
    console.log('send Message')
    this.setState({'message': message}); 
    console.log(this.state.message);
  }

在我的routes.rb文件中,我有这个

resources :messages
get 'threads/:id', to: 'message_threads#index'
post '/pusher/auth', to: 'pusher#auth'

我缺少一些必需的参数,这是我得到的错误。 Pusher::Error - Bad request: Missing required parameter:

根据this tutorial的流程是,在将数据发送给Pusher之前,需要先由rails数据库保留该消息。

我现在的问题是如何生成the app here的React端使用的额外参数(from_uid,thread_uid,to_uid),以便创建消息?

另外,如何使用Pusher对用户进行身份验证?

根据这个stackoverflow link,他们从Rails得到这样的CSRF值 - csrf = $('meta[name=csrf-token]').attr('content')

但我无法在React中实现相同的功能。

我只需要澄清一下。任何帮助都感激不尽。感谢。

1 个答案:

答案 0 :(得分:0)

git repo的作者回答。

我在这里创建的示例非常简单,但下面是一些要点,我希望将解释如何扩展它。

  • 将用户模型和线程模型添加到Rails应用程序
  • 创建用户时,为用户生成公共UID(您可以使用Ruby的内置SecureRandom.uuid生成ID)并将其保存到DB。这将成为您在javascript中公开的用户的ID,以允许用户之间的通信。所有用户都有UID。
  • 创建线程时,生成一个线程UID,这将成为发生对话的唯一ID。
  • 添加Users_Threads has_and_belongs_to_many关系,以便最终跟踪订阅哪些主题的用户
  • 当React应用加载时,使用Ajax请求获取当前用户的朋友列表(返回用户详细信息列表及其uid)以及获取当前用户的所有线程的请求
  • 因此,举个例如,名为Fred的用户点击了名为Bob的用户,并希望向Bob发送消息,但他们当前没有线程。 Fred键入消息,单击Submit并发送包含消息文本的Ajax请求,from_uid(Fred)和to_uid(Bob),thread_uid为null(因为没有现有的convo且没有现有的线程)。
  • 您的Rails应用程序然后在控制器上接收到该请求,并看到Fred正在尝试向Bob发送消息并且线程ID为空,因此控制器创建一个新线程(具有自己的UID),然后添加两个条目users_threads用于新的thread_uid和bob的uid,另一个用于新的thread_uid和Fred的uid。之后,您将使用该thread_uid和参与者详细信息创建一条消息。

您也可能希望用户看到他们是新线程的一部分,而无需重新加载页面,因此我认为您只是想要通知用户新线程的Pusher频道订阅。所以我在创建新线程后在UserThreads模型中说你可以发送像Pusher.trigger('threads_channel', user_secret_uid, { thread: new_thread_uid })这样的东西。您还需要在react应用程序中确保每个用户为其user_secret_uid订阅threads_channel。为了安全起见,我确保这是一个与消息传递不同的uid,否则人们可以订阅不同用户线程的列表。