首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Sinatra 和 MongoDB 在 IBM Bluemix 上构建一个大会签到程序-2

使用 Sinatra 和 MongoDB 在 IBM Bluemix 上构建一个大会签到程序-2

第 3 步. 获取访问 Twitter API        的能力开始使用该应用程序所需的最后一个要素是访问 Twitter API 的能力。转到        https://dev.twitter.com/,登录并创建一个新应用程序。完成此操作后,导航到应用程序的页面,您将找到您的 API        公钥和私钥。在该页面的底部,会有一个按钮生成您的访问令牌 - 单击此按钮。一分钟之后,您应能够刷新页面,看到您的访问令牌和访问令牌私钥。
要从应用程序连接到该 API,我们将使用环境变量。最佳实践要求,不应将秘密、密钥和密码存储在代码中,所以我们添加了一些环境变量来代替它。需要创建 4 个环境变量:
  • TWITTER_CONSUMER_KEY
  • TWITTER_CONSUMER_SECRET
  • TWITTER_ACCESS_TOKEN
  • TWITTER_ACCESS_TOKEN_SECRET
将这些变量的值设置为您的 Twitter 应用程序页面上列出的值。在 Windows® 上,可以在控制面板的 “系统” 部分设置这些值。在 Mac OS X 和        Linux® 上,通常使用 export 命令将这些值添加到 .bashrc 或类似的启动脚本中。
还需要在 Bluemix 上设置这些环境变量,以便在应用程序部署到这里时获得它们。为此,按如下方式使用 cf set-env 命令:
1
cf set-env [appname] [key] [value]




例如,如果应用程序名称为 myconf2014,而且 Twitter Consumer Key 为        abcdefghijklmnopqrstuvwxyz,那么可以使用下面这条命令:
1
cf set-env myconf2014 TWITTER_CONSUMER_KEY abcdefghijklmnopqrstuvwxyz




一定要对上面列出的 4 个变量中的每一个重复该过程。设置对 Twitter 的访问后,然后就可以开始编码了。
第 4 步.        启动大会签到应用程序现在我们已完成了基本配置工作,接下来就可以构建应用程序了。首先,向主要应用程序文件 app.rb 添加依赖关系和配置块。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
...

configure :production do
  # Get the credentials for the MongoDB Bluemix service
  env = JSON.parse(ENV["VCAP_SERVICES"])["mongodb-2.2"].first["credentials"]

  # Connect to MongoDB and authenticate using environment variables
  conn = MongoClient.new(env["hostname"], env["port"])
  db = conn.db(env["db"])
  db.authenticate(env["username"], env["password"])

  # Store the DB connection in a setting for easy later retrieval
  set :db, db
end




此代码定义应用程序的依赖关系,包含一个 configure 代码块,用于设置生产环境中使用的 MongoDB 连接。在 Bluemix        上,服务设置存储在环境变量 VCAP_SERVICES 中,我们可从此变量读取生产 MongoDB 服务的连接设置。接下来,向 app.rb        文件添加一个类似的代码块,但仅用于本地开发。此代码为:
1
2
3
4
5
6
7
8
...

    configure :development do
      conn = MongoClient.new("localhost", 27017)
      db = conn.db("myconf2014")

      set :db, db
    end




此代码告诉应用程序在开发模式下运行时连接到一个本地 MongoDB 数据库。使用 rackup        在本地运行该应用程序时,它在默认情况下会按这种方式运行。
最终的配置代码块可以同时在生产和开发环境中运行。此代码的一个片段如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
...

    configure do
      # Get Mongo collections
      locations = settings.db.collection("locations")
      checkins = settings.db.collection("checkins")
      tweets = settings.db.collection("tweets")

      if locations.count < 1
        baseLocations = [
          {"name" => "Main Pavilion", "slug" => "main-pavilion"},
          ...
          {"name" => "Western Zone 2", "slug" => "west-2"}
        ]
        locations.insert(baseLocations)
      end

      # Connect to Twitter API
      twitter = Twitter::REST::Client.new do |config|
        config.consumer_key = ENV["TWITTER_CONSUMER_KEY"]
        config.consumer_secret = ENV["TWITTER_CONSUMER_SECRET"]
        config.access_token = ENV["TWITTER_ACCESS_TOKEN"]
        config.access_token_secret = ENV["TWITTER_ACCESS_TOKEN_SECRET"]
      end

      set :locations, locations
      set :checkins, checkins
      set :tweets, tweets
      set :twitter, twitter
    end




应用程序的数据将存储在 3 个 MongoDB 集合中:locations、checkins 和          tweets。如果数据库中没有位置(就像我们的第一次运行),那么我们将添加多个新位置。此代码块还设置了与 Twitter API        的连接,用于从之前设置的环境变量读取所需的各种属性。
最后,我们将对每个集合的引用添加到 settings        对象中,该对象将可从该应用程序的所有使用路线中使用。接下来定义第一条路线。应用程序的主页将列出一些最新活动,所以需要从数据库抓取最新的签到信息。根或索引路线 ‘/’ 的定义为:
1
2
3
4
5
6
7
8
9
10
11
  get '/' do
  # Get 10 most recent checkins
  checkins = settings.checkins.find.sort(:timestamp => :desc).limit(10).to_a

  checkins.each do |checkin|
    # Get location details for the checkin
    checkin['location'] = settings.locations.find_one(:_id => checkin['location_id'])
  end

  haml :index, :locals => {:checkins => checkins}
end




此代码将查找数据库中 10 条最新的签到信息。对于每次签到,它都将按照 ID 来查找位置,向 checkin 对象附加更多的位置细节。最后,它将呈现一个名为        index 的 Haml 视图,通过一个局部变量传递签到信息。在默认情况下,Sinatra 将在项目的 views 子目录中寻找此视图,它要求将该视图命名为        index.haml。
返回列表