stream-Rails é um cliente Ruby on Rails para Stream.
Você pode se inscrever para uma conta Stream em https://getstream.io/get_started.
Observe que também existe uma biblioteca de integração Ruby - Stream de nível inferior que é adequada para todos os aplicativos Ruby.
Esta é uma biblioteca para o produto Feeds . Os SDKs do Chat podem ser encontrados aqui.
O que você pode construir:
Fluxos de atividades como os vistos no Github
Um feed de notícias estilo Twitter
Um feed como instagram/pinterest
Feeds de notícias estilo Facebook
Um sistema de notificação
Você pode conferir nosso aplicativo de exemplo criado usando esta biblioteca no Github https://github.com/GetStream/Stream-Example-Rails
Fluxos de atividades e feeds de notícias
Demonstração
Índice
Instalação de gema
Configurar
ORMs suportados
Registro ativo
Sequela
Configuração do modelo
Campos de atividade
Dados extras de atividade
Criação de atividade
Gerenciador de feeds
Alimentação do usuário:
Feeds de notícias:
Feed de notificação:
Feeds agrupados com feed_manager
Siga um feed
Mostrando o feed de notícias
Enriquecimento de atividades
Modelagem
Paginação
Desativar rastreamento de modelo
Especificações de execução
Documentação completa e acesso a APIs de baixo nível
Informações sobre direitos autorais e licença
Você pode instalar stream_rails
como faria com qualquer outra jóia:
gem install stream_rails
ou em seu Gemfile:
gem 'stream_rails'
Esta biblioteca é testada e oferece suporte total às seguintes versões do Rails:
5,0
5.2
6,0
6.1
Faça login no Github em getstream.io e obtenha seu api_key
e api_secret
na configuração do seu aplicativo (tela do painel).
Então você pode adicionar a configuração do StreamRails em config/initializers/stream_rails.rb
require 'stream_rails'StreamRails.configure do |config| config.api_key = "SUA CHAVE DE API" config.api_secret = "SEU SEGREDO DE API" config.timeout = 30 # Opcional, o padrão é 3 config.location = 'us-east' # Opcional, o padrão é a configuração 'us-east'. api_hostname = 'stream-io-api.com' # Opcional, o padrão é 'stream-io-api.com' # Se você usar nomes de feed personalizados, por exemplo: timeline_flat, timeline_gregated, # use isto, caso contrário, omita: config.news_feeds = { flat: "timeline_flat", agregado: "timeline_gregated" } # Aponte para o grupo de feed de notificações fornecendo o nome, omita se você não tiver # um feed de notificações config.notification_feed = "notificação" fim
A integração ficará da seguinte forma:
class Pin < ActiveRecord::Base include StreamRails::Activity as_activity def Activity_object self.item endend
Por favor, use Sequel ~5
.
A integração ficará da seguinte forma:
class Pin <Sequel::Model include StreamRails::Activity as_activity def Activity_object self.item endend
Inclua StreamRails::Activity e adicione as_activity ao modelo que você deseja integrar aos seus feeds.
class Pin < ActiveRecord::Base pertence_to: usuário pertence_to: item valida: item, presença: verdadeiro valida: usuário, presença: verdadeiro inclui StreamRails::Activity as_activity def atividade_objeto self.item endend
Cada vez que um Pin é criado ele será armazenado no feed do usuário que o criou. Quando uma instância de Pin for excluída, o feed também será removido.
Os modelos ActiveRecord são armazenados em seus feeds como atividades; Atividades são objetos que contam a história de uma pessoa realizando uma ação sobre ou com um objeto. Na sua forma mais simples, uma atividade consiste em um ator, um verbo e um objeto. Para que isso aconteça, seus modelos precisam implementar estes métodos:
#activity_object o objeto da atividade (por exemplo, uma instância do modelo AR)
#activity_actor o ator que executa a atividade. Esse valor também fornece o nome do feed e o ID do feed ao qual a atividade será adicionada.
Por exemplo, digamos que um Pin seja uma classe polimórfica que pode pertencer a um usuário (por exemplo, ID User
: 1) ou a uma empresa (por exemplo, ID Company
: 1). Nesse caso, o código abaixo postaria o pin no feed user:1
ou no feed company:1
com base em seu proprietário.
class Pin < ActiveRecord :: Base pertence_to :owner, :polymorphic => true pertence_to :item include StreamRails ::Activity as_activity def Activity_actor self.owner end def Activity_object self.item endend
O padrão de activity_actor
é self.user
#activity_verb a representação em string do verbo (o padrão é o nome da classe do modelo)
Aqui está um exemplo mais completo da classe Pin:
class Pin < ActiveRecord::Base pertence_a: autor pertence_a: item inclui StreamRails::Atividade as_atividade def atividade_ator self.author end def atividade_objeto self.item endend
Freqüentemente, você desejará armazenar mais dados do que apenas os campos básicos. Você consegue isso implementando #activity_extra_data
em seu modelo.
class Pin < ActiveRecord::Base pertence_to: autor pertence_to: item inclui StreamRails::Activity as_activity def atividade_extra_data {'is_retweet' => self.is_retweet} end def Activity_object self.item endend
Se você deseja controlar quando criar uma atividade, você deve implementar o #activity_should_sync?
método em seu modelo.
class Pin < ActiveRecord::Base pertence_to :autor pertence_to :item include StreamRails::Activity as_activity def atividade_should_sync? self.published end def atividade_objeto self.item endend
Isso criará uma atividade somente quando self.published
for verdadeiro.
stream_rails
vem com uma classe Feed Manager que ajuda em todas as operações comuns de feed. Você pode obter uma instância do gerenciador com StreamRails.feed_manager
.
feed = StreamRails.feed_manager.get_user_feed(current_user.id)
Para começar, o gerenciador possui 4 feeds pré-configurados. Você pode adicionar mais feeds se seu aplicativo exigir. Os feeds são divididos em três categorias.
O feed do usuário armazena todas as atividades de um usuário. Pense nisso como sua página pessoal no Facebook. Você pode obter facilmente esse feed do gerente.
feed = StreamRails.feed_manager.get_user_feed(current_user.id)
Os feeds de notícias armazenam atividades das pessoas que você segue. Existe um feed de notícias simples (semelhante ao Twitter) e um feed de notícias agregado (como o Facebook).
feed = StreamRails.feed_manager.get_news_feeds(current_user.id)[:flat] agregado_feed = StreamRails.feed_manager.get_news_feeds(current_user.id)[:agregado]
O feed de notificação pode ser usado para criar funcionalidade de notificação.
Abaixo mostramos um exemplo de como você pode ler o feed de notificação.
notificação_feed=StreamRails.feed_manager.get_notification_feed(user_atual.id)
Por padrão, o feed de notificação estará vazio. Você pode especificar quais usuários notificarão quando seu modelo for criado. No caso de um retuíte, você provavelmente deseja notificar o usuário sobre o tweet pai.
class Pin < ActiveRecord::Base pertence_to: autor pertence_to: item inclui 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
Outro exemplo seria seguir um usuário. Normalmente, você gostaria de notificar o usuário que está sendo seguido.
classe Seguir <ActiveRecord::Base pertence_to: usuário pertence_to: alvo valida: alvo_id, presença: verdadeiro valida: usuário, presença: verdadeiro inclui StreamRails::Activity as_activity def atividade_notify [StreamRails.feed_manager.get_notification_feed (self.target_id)] end def atividade_objeto fim self.target
Para preencher os feeds de notícias, você precisa notificar o sistema sobre os relacionamentos a seguir.
Os feeds simples e agregados do usuário atual seguirão o feed do usuário de target_user
, com o seguinte código:
StreamRails.feed_manager.follow_user(user_id, target_id)
Quando você lê dados de feeds, uma atividade de fixação terá a seguinte aparência:
{ "ator": "Usuário:1", "verbo": "curtir", "objeto": "Item:42" }
Isso está longe de estar pronto para uso em seu modelo. Chamamos o processo de carregamento das referências do banco de dados de “enriquecimento”. Um exemplo é mostrado abaixo:
enriquecedor = StreamRails::Enrich.newfeed = StreamRails.feed_manager.get_news_feeds(current_user.id)[:flat]results = feed.get()['results']activities = richer.enrich_activities(resultados)
Um método semelhante chamado enrich_aggregated_activities
está disponível para feeds agregados.
enriquecedor = StreamRails::Enrich.newfeed = StreamRails.feed_manager.get_news_feeds(current_user.id)[:agregado]resultados = feed.get()['resultados']atividades = enriquecedor.enrich_gregated_activities(resultados)
Se você tiver metadados adicionais em sua atividade (substituindo activity_extra_data
na classe onde você adiciona o mixin Stream Activity), você também pode enriquecer os dados desse campo fazendo o seguinte:
Etapa um: substitua o método activity_extra_data
do nosso mixin:
class Pin < ActiveRecord::Base include StreamRails::Activity as_activity attr_accessor :extra_data def Activity_object self.item end # substitua este método para adicionar metadados à sua atividade def Activity_extra_data @extra_data endend
Agora criaremos um objeto 'pin' que possui um campo de metadados location
. Neste exemplo, também teremos uma tabela e um modelo location
e configuramos nossos metadados no campo extra_data
. É importante que o símbolo dos metadados, bem como o valor dos metadados, correspondam a este padrão. A metade esquerda do valor dos metadados string:string
quando dividido em :
também deve corresponder ao nome do modelo.
Devemos também dizer ao enriquecedor para também buscar locais ao examinar nossas atividades
boulder = Location.newboulder.name = "Boulder, CO"boulder.save!# diga ao enriquecedor para também fazer uma pesquisa no `location` modelenricher.add_fields([:location])pin = Pin.newpin.user = @tompin .extra_data = {:location => "location:#{boulder.id}"}
Quando recuperarmos a atividade posteriormente, o processo de enriquecimento incluirá também nosso modelo location
, dando-nos acesso aos atributos e métodos do modelo de localização:
lugar = atividade[:local].nome# Boulder, CO
Agora que você enriqueceu as atividades, poderá renderizá-las em uma visualização. Por conveniência, incluímos uma visão básica:
<div class="container"> <div class="container-pins"> <% for activity in @activities %> <%= render_activity activity %> <% end %> </div> </div>
O auxiliar de visualização render_activity
renderizará a atividade escolhendo a activity/_pin
para uma atividade de pino, aggregated_activity/_follow
para uma atividade agregada com verbo seguir.
O helper enviará automaticamente activity
para o escopo local da parcial; parâmetros adicionais podem ser enviados, bem como usar layouts diferentes e prefixar o nome
por exemplo, torna a atividade parcial usando o layout small_activity
:
<%= render_activity activity, :layout => "small_activity" %>
por exemplo, prefixa o nome do modelo com "notification_":
<%= render_activity activity, :prefix => "notification_" %>
por exemplo, adiciona extra_var ao escopo parcial:
<%= render_activity activity, :locals => {:extra_var => 42} %>
por exemplo, renderiza a atividade parcial usando a raiz parcial notifications
, que renderizará a parcial com o caminho notifications/#{ACTIVITY_VERB}
<%= render_activity activity, :partial_root => "notifications" %>
Para paginação simples você pode usar a API stream-Ruby, como segue no seu controlador:
StreamRails.feed_manager.get_news_feeds(current_user.id)[:flat] # Retorna um objeto Stream::Feed results = feed.get(limit: 5, offset: 5)['results']
Você pode desativar o rastreamento de modelo (por exemplo, ao executar testes) via StreamRails.configure
require 'stream_rails' StreamRails.enabled = false
No diretório raiz do projeto:
./bin/run_tests.sh
Quando necessário, você também pode usar diretamente a API Ruby de baixo nível. A documentação está disponível no site do Stream.
Copyright (c) 2014-2021 Stream.io Inc e colaboradores individuais. Todos os direitos reservados.
Consulte o arquivo "LICENÇA" para obter informações sobre o histórico deste software, termos e condições de uso e uma ISENÇÃO DE TODAS AS GARANTIAS.