запретить подписчикам actioncable отправлять сообщения в чаты, в которых они не участвуют в Rails - PullRequest
0 голосов
/ 28 мая 2020

Если мое приложение использует AJAX для отправки message пользователя на серверный speak метод, который не нуждается в контроллере (и, следовательно, нет места для записи before_filter), как бы я реализовал поведение что ограничивает users, не являющихся частью этого conversation, отправлять сообщения через консоль браузера?

Если я открываю свое приложение и набираю App.messages.speak("hi", #guess random number#), это сообщение отправляется в беседу, независимо от того, являются ли они его частью.

messages_channel.rb

class MessagesChannel < ApplicationCable::Channel
 def speak(data)
  Message.create! body: data['body'], conversation_id: data['conversation_id'], user_id: current_user.id
 end
end

messages.coffee

App.messages = App.cable.subscriptions.create "MessagesChannel", 
 speak: (body, conversation_id) ->
  @perform 'speak', body: body, conversation_id: conversation_id

 submit_message = () ->
 $('#response').on 'keydown', (event) ->
  if event.keyCode is 13
    conversation_id = $("[data-conversation-id]").data("conversation-id")
    App.messages.speak(event.target.value, conversation_id)
    event.target.value = ""
    event.preventDefault()

Я думаю, что могу удалить параметр conversation_id из метода speak и установить его в другом месте, кроме t зависит от ввода пользователя? В настоящее время я настроил его как атрибут данных, что означает, что люди все еще могут с ним связываться.

1 Ответ

0 голосов
/ 29 мая 2020

Решено с помощью обратного вызова.

class Message < ApplicationRecord
 before_create :exclude_non_participants

 def exclude_non_participants
  if conversation.participates?(user)
   true
  else
   throw :abort
  end
 end
end

participates?(user) в данном случае:

class Conversation < ApplicationRecord
 def participates?(user)
 sender == user || receiver == user
 end
end

Если есть лучший способ сделать это, дайте мне знать. На данный момент, я думаю, это работает?

...