stream-rails — это клиент Ruby on Rails для Stream.
Вы можете зарегистрировать учетную запись Stream по адресу https://getstream.io/get_started.
Обратите внимание, что существует также библиотека интеграции Ruby более низкого уровня — Stream, которая подходит для всех приложений Ruby.
Это библиотека для продукта Feeds . Пакеты SDK для чата можно найти здесь.
Что вы можете построить:
Потоки активности, например, на Github.
Лента новостей в стиле Твиттера
Лента типа Instagram/Pinterest
Ленты новостей в стиле Facebook
Система уведомлений
Вы можете посмотреть наш пример приложения, созданного с использованием этой библиотеки, на Github https://github.com/GetStream/Stream-Example-Rails.
Ленты активности и ленты новостей
Демо
Оглавление
Установка драгоценного камня
Настраивать
Поддерживаемые ORM
АктивРекорд
Продолжение
Конфигурация модели
Поля активности
Дополнительные данные о деятельности
Создание активности
Менеджер каналов
Лента пользователей:
Ленты новостей:
Лента уведомлений:
Ленты в комплекте с Feed_manager
Следите за лентой
Показ ленты новостей
Обогащение деятельности
Шаблонизация
Пагинация
Отключить отслеживание моделей
Технические характеристики
Полная документация и доступ к API низкого уровня.
Информация об авторских правах и лицензии
Вы можете stream_rails
как и любой другой драгоценный камень:
gem install stream_rails
или в вашем Gemfile:
gem 'stream_rails'
Эта библиотека протестирована и полностью поддерживает следующие версии Rails:
5.0
5.2
6.0
6.1
Войдите с помощью Github на getstream.io и получите свои api_key
и api_secret
из конфигурации вашего приложения (экран панели инструментов).
Затем вы можете добавить конфигурацию StreamRails в config/initializers/stream_rails.rb
требуется 'stream_rails'StreamRails.configure do |config| config.api_key = «ВАШ КЛЮЧ API» config.api_secret = «СЕКРЕТ ВАШЕГО API» config.timeout = 30 # Необязательно, по умолчанию — 3 config.location = «us-east» # Необязательно, по умолчанию — «us-east» config. api_hostname = 'stream-io-api.com' # Необязательно, по умолчанию «stream-io-api.com» # Если вы используете собственные имена каналов, например: timeline_ Flat, timeline_aggregated, # используйте это, иначе опустите: config.news_feeds = { Flat: "timeline_flat", Aggregated: "timeline_aggregated" } # Укажите на группу каналов уведомлений, содержащую имя, пропустите, если у вас # нет канала уведомлений config.notification_feed = "уведомление" конец
Интеграция будет выглядеть следующим образом:
class Pin < ActiveRecord::Base включает StreamRails::Activity as_activity def Activity_object self.item endend
Пожалуйста, используйте Sequel ~5
.
Интеграция будет выглядеть следующим образом:
class Pin < Sequel::Model включает StreamRails::Activity as_activity def Activity_object self.item endend
Включите StreamRails::Activity и добавьте as_activity в модель, которую вы хотите интегрировать со своими фидами.
класс Pin < ActiveRecord::Base принадлежит_to :пользователь принадлежит_то :item проверяет :item, присутствие: true проверяет :user, присутствие: true включает StreamRails::Activity as_activity def Activity_object self.item endend
Каждый раз, когда создается пин, он сохраняется в ленте пользователя, который его создал. При удалении экземпляра пина канал также будет удален.
Модели ActiveRecord хранятся в ваших лентах как действия; Действия — это объекты, которые рассказывают историю человека, выполняющего действие с объектом или с ним. В простейшей форме действие состоит из действующего лица, глагола и объекта. Чтобы это произошло, ваши модели должны реализовать следующие методы:
#activity_object объект действия (например, экземпляр модели AR)
#activity_actor — действующее лицо, выполняющее действие. Это значение также содержит имя и идентификатор канала, к которому будет добавлено действие.
Например, предположим, что ПИН представляет собой полиморфный класс, который может принадлежать либо пользователю (например, идентификатор User
: 1), либо компании (например, идентификатор Company
: 1). В этом случае приведенный ниже код будет публиковать пин-код либо в канале user:1
, либо в канале company:1
в зависимости от его владельца.
class Pin < ActiveRecord::Base own_to :owner, :polymorphic => true own_to :item include StreamRails::Activity as_activity def Activity_actor self.owner end def Activity_object self.item endend
По умолчанию для activity_actor
установлено значение self.user
#activity_verb строковое представление глагола (по умолчанию имя класса модели)
Вот более полный пример класса Pin:
class Pin < ActiveRecord::Base принадлежит_to :автор принадлежит_то :item include StreamRails::Activity as_activity def Activity_actor self.author end def Activity_object self.item endend
Часто вам потребуется хранить больше данных, чем просто основные поля. Это достигается путем реализации #activity_extra_data
в вашей модели.
класс Pin < ActiveRecord::Base принадлежит_to :автор принадлежит_то :item включает StreamRails::Activity as_activity def Activity_extra_data {'is_retweet' => self.is_retweet} end def Activity_object self.item endend
Если вы хотите контролировать, когда создавать действие, вам следует реализовать #activity_should_sync?
метод в вашей модели.
class Pin < ActiveRecord::Base own_to :author own_to :item include StreamRails::Activity as_activity def Activity_should_sync? self.published end def Activity_object self.item endend
Это создаст активность только в том случае, если self.published
имеет значение true.
В stream_rails
входит класс Feed Manager, который помогает выполнять все распространенные операции с фидами. Вы можете получить экземпляр менеджера с помощью StreamRails.feed_manager
.
канал = StreamRails.feed_manager.get_user_feed(current_user.id)
Для начала в менеджере предварительно настроены 4 канала. Вы можете добавить дополнительные каналы, если этого требует ваше приложение. Корма разделены на три категории.
В ленте пользователей хранятся все действия пользователя. Думайте об этом как о своей личной странице в Facebook. Этот фид вы легко можете получить у менеджера.
канал = StreamRails.feed_manager.get_user_feed(current_user.id)
Ленты новостей хранят информацию о действиях людей, на которых вы подписаны. Существует как простая лента новостей (похожая на Twitter), так и агрегированная лента новостей (например, Facebook).
канал = StreamRails.feed_manager.get_news_feeds(current_user.id)[:квартира] агрегированный_канал = StreamRails.feed_manager.get_news_feeds(current_user.id)[:агрегированный]
Ленту уведомлений можно использовать для создания функций уведомлений.
Ниже мы покажем пример того, как можно читать ленту уведомлений.
Notification_feed = StreamRails.feed_manager.get_notification_feed(current_user.id)
По умолчанию лента уведомлений будет пустой. Вы можете указать, каких пользователей следует уведомлять при создании вашей модели. В случае ретвита вы, вероятно, захотите уведомить пользователя о родительском твите.
class Pin < ActiveRecord::Base принадлежит_to :автор принадлежит_то :item include StreamRails::Activity as_activity def Activity_notify if self.is_retweet [StreamRails.feed_manager.get_notification_feed(self.parent.user_id)] end end def Activity_object self.item endend
Другим примером может быть подписка на пользователя. Обычно вы хотите уведомить пользователя, за которым следят.
class Follow < ActiveRecord::Base принадлежит_to :пользователь принадлежит_то :цель проверяет :target_id, присутствие: true проверяет :user, присутствие: true включает StreamRails::Activity as_activity def Activity_notify [StreamRails.feed_manager.get_notification_feed(self.target_id)] end def Activity_object конец self.target
Чтобы заполнить новостные ленты, вам необходимо уведомить систему о подписке.
Неструктурированные и агрегированные каналы текущего пользователя будут следовать за пользовательским каналом target_user
со следующим кодом:
StreamRails.feed_manager.follow_user(user_id, target_id)
Когда вы читаете данные из каналов, действие закрепления будет выглядеть следующим образом:
{ "актёр": "Пользователь:1", "глагол": "нравится", "объект": "Элемент:42" }
Это далеко не готово для использования в вашем шаблоне. Мы называем процесс загрузки ссылок из базы данных «обогащением». Пример показан ниже:
обогащение = StreamRails::Enrich.newfeed = StreamRails.feed_manager.get_news_feeds(current_user.id)[:квартира]results =feed.get()['results']activities = richer.enrich_activities(results)
Аналогичный метод, называемый enrich_aggregated_activities
, доступен для агрегированных каналов.
обогащение = StreamRails::Enrich.newfeed = StreamRails.feed_manager.get_news_feeds(current_user.id)[:aggregated]results =feed.get()['results']activities = richer.enrich_aggregated_activities(results)
Если в вашей активности есть дополнительные метаданные (путем переопределения activity_extra_data
в классе, куда вы добавляете миксин Stream Activity), вы также можете обогатить данные этого поля, выполнив следующие действия:
Шаг первый: переопределить метод activity_extra_data
из нашего миксина:
class Pin < ActiveRecord::Base include StreamRails::Activity as_activity attr_accessor :extra_data def Activity_object self.item end # переопределить этот метод для добавления метаданных в вашу активность def Activity_extra_data @extra_data endend
Теперь мы создадим объект «булавка», который имеет поле метаданных location
. В этом примере у нас также будет таблица location
и модель, и мы настроим наши метаданные в поле extra_data
. Важно, чтобы символ метаданных, а также значение метаданных соответствовали этому шаблону. Левая половина значения метаданных string:string
при разделении на :
также должна соответствовать имени модели.
Мы также должны указать обогатителю, чтобы он также извлекал местоположения при просмотре наших действий.
boulder = Location.newboulder.name = "Boulder, CO"boulder.save!# сообщите обогатителю, чтобы он также выполнил поиск по `location` modelenricher.add_fields([:location])pin = Pin.newpin.user = @tompin .extra_data = {:location => "location:#{boulder.id}"}
Когда мы позже получим это действие, процесс обогащения также будет включать нашу модель location
, предоставляя нам доступ к атрибутам и методам модели местоположения:
место = активность[:местоположение].имя# Боулдер, Колорадо
Теперь, когда вы обогатили действия, вы можете отобразить их в представлении. Для удобства мы включили базовый вид:
<div class="container"> <div class="container-pins"> <% for activity in @activities %> <%= render_activity activity %> <% end %> </div> </div>
Помощник представления render_activity
будет отображать действие, выбирая частичное activity/_pin
для действия закрепления, aggregated_activity/_follow
для агрегированного действия с глаголом следовать.
Помощник автоматически отправит activity
в локальную область действия партиала; можно отправлять дополнительные параметры, а также использовать разные макеты и префикс имени
например, отображает частичную активность, используя макет small_activity
:
<%= render_activity activity, :layout => "small_activity" %>
например, добавляет к имени шаблона префикс «notification_»:
<%= render_activity activity, :prefix => "notification_" %>
например, добавляет extra_var в частичную область видимости:
<%= render_activity activity, :locals => {:extra_var => 42} %>
например, отображает партиал активности, используя корень партиала notifications
, который будет отображать партиал с путем notifications/#{ACTIVITY_VERB}
<%= render_activity activity, :partial_root => "notifications" %>
Для простой нумерации страниц вы можете использовать API потока Ruby, как показано ниже в вашем контроллере:
StreamRails.feed_manager.get_news_feeds(current_user.id)[:квартира] # Возвращает объект Stream::Feed results =feed.get(limit: 5, offset: 5)['results']
Вы можете отключить отслеживание модели (например, при запуске тестов) через StreamRails.configure.
require 'stream_rails' StreamRails.enabled = false
Из корневого каталога проекта:
./bin/run_tests.sh
При необходимости вы также можете напрямую использовать низкоуровневый API Ruby. Документация доступна на сайте Stream.
Авторские права (c) Stream.io Inc, 2014–2021 гг. и отдельные участники. Все права защищены.
См. файл «ЛИЦЕНЗИЯ» для получения информации об истории этого программного обеспечения, условиях использования, а также ОТКАЗЕ ОТ ВСЕХ ГАРАНТИЙ.