2016-05-19 3 views
0

Где я могу хранить идентификатор темы?Как определить текущую тему?

Что касается сокета, я могу использовать:

def join("topic:" <> topic_id, _params, socket) do 
    ... 
    socket= assign(socket, :topic_id, topic_id) 
    {:ok, socket} 
end 

Это было в рамках сокетов, но мои пользователи могут присоединиться к нескольким темам одновременно, а это означает, что приведенный выше код будет перекрывать topic_id каждый раз, когда новый тема присоединена, это правда?

Что делать, если я хочу знать, какой идентификатор темы активен в handle_in?

, например:

def handle_in("new_message", params, socket) do 

    # what is the active topic id here? 

end 

Я хоть это:

def handle_in("new_message:" <> topic_id, params, socket) do 

    # now, I know that topic_id is the active topic 

end 

Есть еще один способ сделать это? или как это делается?

ответ

0

join имеет тему, так что вы можете выполнить дополнительную проверку, чтобы проверить, пользователь может подписаться на эту тему (проверьте их разрешения и т.д.)

Вы правильно, после того, как есть подписка на эту тему, каналы мультиплексируются через сокет.

Если вы хотите передать дополнительную информацию для конкретного сообщения, PARAMS является общим местом, чтобы поместить их:

def handle_in("new_message", %{"topic_id" => topic_id}, socket) do 
    ... 
end 

Если бы вы могли объяснить, почему вам нужно topic_id, то это может помочь ответить на ваш questy,

+0

Спасибо, мне нужно тема ID, так как там может быть настройки, связанные тема при отправке сообщений .. Кроме того, я думал, что объект сокета находится в области канала, но затем я обнаружил, что его в области пользователя, поэтому я хотел убедиться, что я правильно понял, могут ли быть зашифрованы параметры внутри объекта сокета? – simo

+0

На самом деле, пользователи могут присоединиться к каналам территорий, идентификатор территории будет использоваться для чтения связанного многоугольника, тогда я могу проверить, отправлено ли сообщение lat, длинное сообщение внутри или вне полигона территории. Вот пример того, зачем мне нужен идентификатор темы. – simo

+0

Отправляйте land_id в параметры, которые вам нужны. – Gazler

3

Пользователи могут присоединиться к нескольким темам. Вы можете получить доступ к текущему topic от параметра socket в handle_in.

Так предполагая основание этой темы комнатной является "topic", вот как вы можете получить идентификатор темы:

def handle_in("some_message", _params, socket) do 
    "topic:" <> topic_id = socket.topic 
    ... 
end 
Смежные вопросы