Stream-rails 是 Stream 的 Ruby on Rails 客户端。
您可以在 https://getstream.io/get_started 注册 Stream 帐户。
请注意,还有一个较低级别的 Ruby - Stream 集成库,适用于所有 Ruby 应用程序。
这是Feeds产品的库。可以在此处找到聊天 SDK。
您可以构建什么:
活动流,例如在 Github 上看到的
Twitter 风格的新闻源
像 Instagram/pinterest 这样的 feed
Facebook 风格的新闻源
通知系统
您可以在 Github 上查看使用此库构建的示例应用程序 https://github.com/GetStream/Stream-Example-Rails
活动流和新闻源
演示
目录
宝石安装
设置
支持的 ORM
活动记录
续集
型号配置
活动领域
活动额外数据
活动创建
饲料经理
用户提要:
新闻提要:
通知源:
与 feed_manager 捆绑的 Feed
关注动态
显示新闻源
活动丰富化
模板化
分页
禁用模型跟踪
运行规格
完整文档和低级 API 访问
版权和许可信息
您可以像安装任何其他 gem 一样安装stream_rails
:
gem install stream_rails
或者在你的 Gemfile 中:
gem 'stream_rails'
该库经过测试并完全支持以下 Rails 版本:
5.0
5.2
6.0
6.1
在 getstream.io 上使用 Github 登录,然后从应用程序配置(仪表板屏幕)获取api_key
和api_secret
。
然后您可以在config/initializers/stream_rails.rb
中添加 StreamRails 配置
需要'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' # 如果您使用自定义提要名称,例如:时间线_平,时间线_聚合,#使用这个,否则省略:config.news_feeds = {平:“timeline_flat”,聚合:“timeline_aggreated”}#指向提供名称的通知提要组,如果没有通知提要则省略config.notification_feed = "通知"结束
集成将如下所示:
class Pin < ActiveRecord::Base include StreamRails::Activity as_activity def Activity_object self.item endend
请使用 Sequel ~5
。
集成将如下所示:
class Pin < Sequel::Model include StreamRails::Activity as_activity def Activity_object self.item endend
包含 StreamRails::Activity 并将 as_activity 添加到要与源集成的模型中。
类 Pin < ActiveRecord::Base 属于_to :用户 属于_to :item 验证 :item, Presence: true 验证 :user, Presence: true include StreamRails::Activity as_activity def Activity_object self.item endend
每次创建 Pin 图时,它都会存储在创建它的用户的源中。当删除 Pin 图实例时,提要也将被删除。
ActiveRecord 模型作为活动存储在您的 feed 中;活动是讲述一个人在某个对象上或使用某个对象执行操作的故事的对象,以最简单的形式,活动由参与者、动词和对象组成。为了实现这一点,您的模型需要实现以下方法:
#activity_object活动的对象(例如 AR 模型实例)
#activity_actor执行活动的参与者——该值还提供要添加活动的提要名称和提要 ID。
例如,假设 Pin 是一个多态类,可以属于用户(例如User
ID:1)或公司(例如Company
ID:1)。在这种情况下,以下代码将根据其所有者将 pin 发布到user:1
feed 或company:1
feed。
class Pin < ActiveRecord::Base 属于_to :owner, :polymorphic => true 属于_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 类的更完整示例:
类 Pin < ActiveRecord::Base 属于_to :作者 属于_to :item 包括 StreamRails::Activity as_activity def Activity_actor self.author end def Activity_object self.item endend
通常您想要存储的数据不仅仅是基本字段。您可以通过在模型中实现#activity_extra_data
来实现这一点。
class Pin < ActiveRecord::Base 属于_to :作者属于_to :item include StreamRails::Activity as_activity def Activity_extra_data {'is_retweet' => self.is_retweet} end def Activity_object self.item endend
如果您想控制何时创建活动,您应该实现#activity_should_sync?
模型中的方法。
类 Pin < ActiveRecord::Base 属于_to :作者属于_to :item 包括 StreamRails::Activity as_activity def Activity_should_sync? self.published 结束 def Activity_object self.item endend
仅当self.published
为 true 时才会创建活动。
stream_rails
附带一个 Feed Manager 类,可帮助完成所有常见的 Feed 操作。您可以使用StreamRails.feed_manager
获取管理器的实例。
feed = StreamRails.feed_manager.get_user_feed(current_user.id)
为了帮助您入门,管理器预先配置了 4 个提要。如果您的应用程序需要,您可以添加更多提要。 Feed 分为三类。
用户源存储用户的所有活动。将其视为您的个人 Facebook 页面。您可以轻松地从经理处获取此提要。
feed = StreamRails.feed_manager.get_user_feed(current_user.id)
新闻源存储您关注的人的活动。有平面新闻源(类似于 Twitter)和聚合新闻源(如 Facebook)。
feed = StreamRails.feed_manager.get_news_feeds(current_user.id)[:flat] 聚合饲料= StreamRails.feed_manager.get_news_feeds(current_user.id)[:聚合]
通知源可用于构建通知功能。
下面我们展示了如何阅读通知源的示例。
notification_feed = StreamRails.feed_manager.get_notification_feed(current_user.id)
默认情况下,通知源将为空。您可以指定创建模型时要通知哪些用户。在转发的情况下,您可能希望通知用户父推文。
类 Pin < ActiveRecord::Base 属于_to :作者属于_to :item 包含 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
另一个例子是关注用户。您通常希望通知正在被关注的用户。
类 Follow < ActiveRecord::Base 属于_to :用户 属于_to :目标 验证 :target_id, Presence: true 验证 :user, Presence: true include StreamRails::Activity as_activity def Activity_notify [StreamRails.feed_manager.get_notification_feed(self.target_id)] end def Activity_object自目标端
为了填充新闻源,您需要通知系统有关关注关系。
当前用户的平面和聚合 feed 将遵循target_user
的用户 feed,代码如下:
StreamRails.feed_manager.follow_user(user_id, target_id)
当您从 feed 中读取数据时,pin 活动将如下所示:
{ "actor": "User:1", "verb": "like", "object": "Item:42" }
这还远未准备好在您的模板中使用。我们将从数据库加载参考文献的过程称为“丰富”。示例如下所示:
丰富者= StreamRails :: Enrich.newfeed = StreamRails.feed_manager.get_news_feeds(current_user.id)[:平]结果= feed.get()['结果']活动=丰富者.enrich_activities(结果)
名为enrich_aggregated_activities
的类似方法可用于聚合提要。
丰富器= StreamRails :: Enrich.newfeed = StreamRails.feed_manager.get_news_feeds(current_user.id)[:聚合]结果= feed.get()['结果']活动=丰富器.enrich_aggreated_activities(结果)
如果您的活动中有其他元数据(通过覆盖添加流活动混合的类中的activity_extra_data
),您还可以通过执行以下操作来丰富该字段的数据:
第一步:重写 mixin 中的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
数据字段的“pin”对象。在此示例中,我们还将有一个location
表和模型,并在extra_data
字段中设置元数据。重要的是元数据的符号以及元数据的值与此模式匹配。 string:string
元数据值的左半部分在:
上拆分时也必须与模型名称匹配。
我们还必须告诉丰富器在查看我们的活动时也获取位置
boulder = Location.newboulder.name = "Boulder, CO"boulder.save!# 告诉丰富器也对 `location` model 进行查找enricher.add_fields([:location])pin = Pin.newpin.user = @tompin .extra_data = {:location => "位置:#{boulder.id}"}
当我们稍后检索活动时,丰富过程也将包括我们的location
模型,使我们能够访问位置模型的属性和方法:
地点 = 活动[:位置].name# 科罗拉多州博尔德
现在您已经丰富了活动,您可以在视图中呈现它们。为了方便起见,我们提供了一个基本视图:
<div class="container"> <div class="container-pins"> <% for activity in @activities %> <%= render_activity activity %> <% end %> </div> </div>
render_activity
视图助手将通过选择 pin 活动的部分activity/_pin
以及带有动词 follow 的聚合活动的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" %>
对于简单的分页,您可以使用stream-ruby API,如下在控制器中:
StreamRails.feed_manager.get_news_feeds(current_user.id)[:flat] # 返回一个 Stream::Feed 对象 results = feed.get(limit: 5, offset: 5)['results']
您可以通过 StreamRails.configure 禁用模型跟踪(例如,当您运行测试时)
require 'stream_rails' StreamRails.enabled = false
从项目根目录:
./bin/run_tests.sh
当需要时,您还可以直接使用低级 Ruby API。 Stream 网站上提供了文档。
版权所有 (c) 2014-2021 Stream.io Inc 和个人贡献者。版权所有。
有关该软件的历史记录、使用条款和条件以及所有保证的免责声明的信息,请参阅文件“许可证”。