edit-icon download-icon

Railsとの統合

最終更新日: Aug 25, 2017

RailsでOSS Ruby SDKを使用するには、 Gemfileに次の依存関係を追加します。

  1. gem 'aliyun-sdk', '~> 0.3.0

次に、OSSを使用するときに依存関係を導入します。

  1. require 'aliyun/oss'

SDKの “rails /“ディレクトリには、操作を容易にするヘルパーコードが用意されています。

次に、SDKを使用して、次の機能を提供する単純なOSSオブジェクトマネージャ(oss-manager)を実装する方法について説明します。

  • ユーザーのすべてのバケットを一覧表示します。
  • バケット内のすべてのオブジェクトをディレクトリのレベルで表示します。
  • オブジェクトをアップロードする。
  • オブジェクトをダウンロードします。

1. プロジェクトを作成する

Railsをインストールし、Railsアプリケーションを作成するoss-manager。

  1. gem install rails
  2. rails new oss-manager

GitHubでプロジェクトコードを管理することをお勧めします。

  1. cd oss-manager
  2. git init
  3. git add .
  4. git commit -m "init project"

2. SDK の依存関係を追加する

SDKの依存関係を oss-manager/Gemfileに追加します。

  1. gem 'aliyun-sdk', '~> 0.3.0'

oss-manager/で以下のコマンドを実行してください。

  1. bundle install

この手順で変更を保存します。

  1. git add .
  2. git commit -m "add aliyun-sdk dependency"

3. OSSクライアントを初期化する

OSSClientインスタンスをプロジェクトで使用するたびに初期化されないようにするには、プロジェクトに初期化ファイルを追加します。

  1. # oss-manager/config/initializers/aliyun_oss_init.rb
  2. require 'aliyun/oss'
  3. module OSS
  4. def self.client
  5. unless @client
  6. Aliyun::Common::Logging.set_log_file('./log/oss_sdk.log')
  7. @client = Aliyun::OSS::Client.new(
  8. endpoint:
  9. Rails.application.secrets.aliyun_oss['endpoint'],
  10. access_key_id:
  11. Rails.application.secrets.aliyun_oss['access_key_id'],
  12. access_key_secret:
  13. Rails.application.secrets.aliyun_oss['access_key_secret']
  14. )
  15. end
  16. @client
  17. end
  18. end

上記のコードは、SDKの”rails/“ディレクトリにあります。初期化ファイルは、プロジェクト内のOSSClientの使用を簡素化します。

  1. buckets = OSS.client.list_buckets

エンドポイント、 AccessKeyID および AccessKeySecret はoss-manager/conf/secrets.ymlに格納されています。 例えば:

  1. development:
  2. secret_key_base: xxxx
  3. aliyun_oss:
  4. endpoint: xxxx
  5. access_key_id: aaaa
  6. access_key_secret: bbbb

コードを保存します。

  1. git add .
  2. git commit -m "add aliyun-sdk initializer"

4. “List Buckets”機能を実装する

まず、Railsを使用してバケット管理用のコントローラを生成します。

  1. rails g controller buckets index

以下のオブジェクトが oss-managerで生成されます。

  • app/controller/buckets_controller.rb: The bucket-related logic code
  • app/views/buckets/index.html.erb: The bucket-related demonstration code
  • app/helpers/buckets_helper.rb: Some helper functions

最初にbuckets_controller.rbを編集します。OSSClientを呼び出して、list_bucketsの結果を@buckets変数に保存します。

  1. class BucketsController < ApplicationController
  2. def index
  3. @buckets = OSS.client.list_buckets
  4. end
  5. end

views/buckets/index.html.erb を編集してバケットリストを表示します。

  1. <h1>Buckets</h1>
  2. <table class="table table-striped">
  3. <tr>
  4. <th>Name</th>
  5. <th>Location</th>
  6. <th>CreationTime</th>
  7. </tr>
  8. <% @buckets.each do |bucket| %>
  9. <tr>
  10. <td><%= link_to bucket.name, bucket_objects_path(bucket.name) %></td>
  11. <td><%= bucket.location %></td>
  12. <td><%= bucket.creation_time.localtime.to_s %></td>
  13. </tr>
  14. <% end %>
  15. </table>

app/helpers/buckets_helper.rb②格納されているbucket_objects_pathはヘルパー関数です。

  1. module BucketsHelper
  2. def bucket_objects_path(bucket_name)
  3. "/buckets/#{bucket_name}/objects"
  4. end
  5. end

この方法によって、すべてのバケットがリストされます。この機能を実装する前に、ブラウザのアドレスバーにアドレスが入力された後に正しいロジックが呼び出されるように、Railsルートを設定してください。config/routes.rbを編集し、以下を追加してください。

  1. resources :buckets do
  2. resources :objects
  3. end

その後、oss-manager /にrails sを入力してRailsサーバを起動し、ブラウザのアドレスバーにhttp://localhost:3000/buckets/ と入力します。バケットリストが表示されます。

最後に、コードを保存します。

  1. git add .
  2. git commit -m "add list buckets feature"

5. “List Objects”機能を実装する

最初にオブジェクト管理用のコントローラを生成します。

  1. rails g controller objects index

app/controllers/objects_controller.rb を次のように編集します。

  1. class ObjectsController < ApplicationController
  2. def index
  3. @bucket_name = params[:bucket_id]
  4. @prefix = params[:prefix]
  5. @bucket = OSS.client.get_bucket(@bucket_name)
  6. @objects = @bucket.list_objects(:prefix => @prefix, :delimiter => '/')
  7. end
  8. end

前述のコードでは、まずURLパラメータからバケット名を取得します。ディレクトリレベルでオブジェクトを一覧表示するには、追加の接頭辞が必要です。オブジェクトリストを取得するには、OSSClientのlist_objects インターフェイスを呼び出します。前述の手順では、スラッシュ(/) で区切られ、名前に指定された接頭辞が含まれているオブジェクトがリストされることに注意してください。これは、ディレクトリレベルでオブジェクトリストを表示することも目的としています。オブジェクトを管理するを参照してください。

次に、edit app/views/objects/index.html.erb を次のように編集します。

  1. <h1>Objects in <%= @bucket_name %></h1>
  2. <p> <%= link_to 'Upload file', new_object_path(@bucket_name, @prefix) %></p>
  3. <table class="table table-striped">
  4. <tr>
  5. <th>Key</th>
  6. <th>Type</th>
  7. <th>Size</th>
  8. <th>LastModified</th>
  9. </tr>
  10. <tr>
  11. <td><%= link_to '../', with_prefix(upper_dir(@prefix)) %></td>
  12. <td>Directory</td>
  13. <td>N/A</td>
  14. <td>N/A</td>
  15. </tr>
  16. <% @objects.each do |object| %>
  17. <tr>
  18. <% if object.is_a?(Aliyun::OSS::Object) %>
  19. <td><%= link_to remove_prefix(object.key, @prefix),
  20. @bucket.object_url(object.key) %></td>
  21. <td><%= object.type %></td>
  22. <td><%= number_to_human_size(object.size) %></td>
  23. <td><%= object.last_modified.localtime.to_s %></td>
  24. <% else %>
  25. <td><%= link_to remove_prefix(object, @prefix), with_prefix(object) %></td>
  26. <td>Directory</td>
  27. <td>N/A</td>
  28. <td>N/A</td>
  29. <% end %>
  30. </tr>
  31. <% end %>
  32. </table>

上記のコードでは、ディレクトリ構造に従ってオブジェクトをリストする主なロジックは次のとおりです。

  1. “../“ は、先頭に常に現れ、上位ディレクトリを示します。
  2. 名前に共通の接頭辞を持つオブジェクトがディレクトリとして表示されます。
  3. オブジェクトはファイルとして表示されます。

上記のコードでは、 with_prefixremove_prefixおよびapp/helpers/objects_helper.rbで定義されている他のヘルパー関数を使用しています。

  1. module ObjectsHelper
  2. def with_prefix(prefix)
  3. "?prefix=#{prefix}"
  4. end
  5. def remove_prefix(key, prefix)
  6. key.sub(/^#{prefix}/, '')
  7. end
  8. def upper_dir(dir)
  9. dir.sub(/[^\/]+\/$/, '') if dir
  10. end
  11. def new_object_path(bucket_name, prefix = nil)
  12. "/buckets/#{bucket_name}/objects/new/#{with_prefix(prefix)}"
  13. end
  14. def objects_path(bucket_name, prefix = nil)
  15. "/buckets/#{bucket_name}/objects/#{with_prefix(prefix)}"
  16. end
  17. end

上記のコードを実行した後、rails sを実行し、ブラウザのアドレスバーにhttp://localhost:3000/buckets/my-bucket/objects/ を入力します。オブジェクトリストが表示されます。

通常どおりコードを保存します。

  1. git add .
  2. git commit -m "add list objects feature"

6. オブジェクトをダウンロースする

上記のコードは、リストされた各オブジェクトへのリンクを追加することに注意してください。

  1. <td><%= link_to remove_prefix(object.key, @prefix),
  2. @bucket.object_url(object.key) %></td>

Bucket#object_urlメソッドは、オブジェクトの一時URLを生成するために使用されます。詳細は オブジェクトをダウンロードするを参照してください。

7. ファイルをアップロードする

Railsなどのサーバーアプリケーションでファイルをアップロードするには、次の2つの方法のいずれかを使用できます。

  • オブジェクトをOSSにアップロードするファイルをRailsサーバーにアップロードします。この方法では、Railsサーバーは、オブジェクトをOSSにコピーすることによってトランジットサーバーとして機能します。アップロードプロセスは非効率的です。
  • Railsサーバーによって生成されたフォームと一時的な資格情報を使用してOSSに直接ファイルをアップロードします。

最初の方法は、一般的なファイルアップロード方法と同様に、比較的簡単です。次に、2番目の方法を使用してファイルをアップロードする方法について説明します。

まず、 #newメソッドをapp/controllers/objects_controller.rbに追加してアップロードフォームを生成します。

  1. def new
  2. @bucket_name = params[:bucket_id]
  3. @prefix = params[:prefix]
  4. @bucket = OSS.client.get_bucket(@bucket_name)
  5. @options = {
  6. :prefix => @prefix,
  7. :redirect => 'http://localhost:3000/buckets/'
  8. }
  9. end

次に、app/views/objects/new.html.erbを次のように編集します。

  1. <h2>Upload object</h2>
  2. <%= upload_form(@bucket, @options) do %>
  3. <table class="table table-striped">
  4. <tr>
  5. <td><label>Bucket:</label></td>
  6. <td><%= @bucket.name %></td>
  7. </tr>
  8. <tr>
  9. <td><label>Prefix:</label></td>
  10. <td><%= @prefix %></td>
  11. </tr>
  12. <tr>
  13. <td><label>Select file:</label></td>
  14. <td><input type="file" name="file" style="display:inline" /></td>
  15. </tr>
  16. <tr>
  17. <td colspan="2">
  18. <input type="submit" class="btn btn-default" value="Upload" />
  19. <span>&nbsp;&nbsp</span>
  20. <%= link_to 'Back', objects_path(@bucket_name, @prefix) %>
  21. </td>
  22. </tr>
  23. </table>
  24. <% end %>

具体的には、upload_formはアップロードフォームの生成を支援するためにSDKが提供するヘルパー関数です。この関数は、SDKのrails/aliyun_oss_helper.rbに格納されています。この関数をapp/helpers/ディレクトリにコピーし、rails sを実行し、http://localhost:3000/buckets/my-bucket/objects/newをブラウザのアドレスバーに入力する必要があります。ファイルがアップロードされます。

最後に、コードを保存することを忘れないでください。

  1. git add .
  2. git commit -m "add upload object feature"

8. スタイルを追加する

いくつかのスタイル(CSS)を追加して、ページの見通しを絞り込むことができます。

最初にbootstrapをダウンロードしてください。パッケージを解凍し、bootstrap.min.cssapp/assets/stylesheets/にコピーしてください。

app/views/layouts/application.html.erb を開き、次のように yield行を修正してください。

  1. <div id="main">
  2. <%= yield %>
  3. </div>

この方法によって、各ページにIDとしてmainを含む<div>が追加されます。 次に、 app/assets/stylesheets/application.cssを修正し、以下の内容を追加します。

  1. body {
  2. text-align: center;
  3. }
  4. div#main {
  5. text-align: left;+
  6. width: 1024px;
  7. margin: 0 auto;
  8. }

前述の変更では、Webページの本文コンテンツが中央のレイアウトで表示されます。新しいスタイルはページレイアウトをよりエレガントにします。

これまでのところ、簡単なデモが完了しました。完全なデモコードは Alibaba Cloud OSS Rails Demoにあります。