LoginSignup
16
6

More than 5 years have passed since last update.

Ruby 製サーバーレスフレームワーク Jets で DynamoDB テーブルを使ったサンプルアプリケーションを実装する

Posted at

はじめに

最近ずっと検証をしている Jets。徐々に記事が積み重なってきました。

今回は、DynamoDB テーブルを使った Jets のサンプルアプリケーションを作ってみました。

前提環境

  • Mac OS X 10.13.6
  • HomeBrew 1.8.6
  • ruby 2.5.1
  • Jets 1.4.5
  • nodejs v9.11.2
  • Java version 100

作成するサンプルアプリケーション

DynamoDB テーブルを使った、Post モデルの CRUD 操作ができるアプリケーションを作ります。

ソースコードは以下にアップしています。

GitHub - gotchane/jets-dynamodb-app-sandbox

手順

DynamoDB テーブル作成までは、以下記事にも手順を書いてあるので、最低限のコマンドだけ記載します。

Ruby 製サーバーレスフレームワーク Jets から DynamoDB アイテムの CRUD 操作を試す - Qiita

Jets アプリケーション新規作成

$ jets new jets-dynamodb-app-sandbox
$ cd jets-dynamodb-app-sandbox

dynamodb-local インストール

$ brew cask install dynamodb-local
$ dynamodb-local

dynamodb-admin インストール

$ npm install dynamodb-admin -g
$ export DYNAMO_ENDPOINT=http://localhost:8000
$ dynamodb-admin

DynamoDB テーブル作成

$ jets dynamodb:generate create_posts
$ jets dynamodb:migrate ./dynamodb/migrate/20190114114303-create_posts_migration.rb

Running database migrations
Calling create_table with params:
{:table_name=>"jets-dynamodb-app-sandbox-dev-posts",
 :key_schema=>[{:attribute_name=>"id", :key_type=>"HASH"}],
 :attribute_definitions=>[{:attribute_name=>"id", :attribute_type=>"S"}],
 :provisioned_throughput=>{:read_capacity_units=>5, :write_capacity_units=>5}}
DynamoDB Table: posts Status: ACTIVE

scaffold で Post モデルの CRUD 画面のひな形作成

ここまでで、DynamoDB のテーブル作成までできました。

ここからは実際に Post モデルの CRUD 操作ができるアプリケーションのひな形を作成していきます。

以下コマンドを実行しましょう。

$ jets generate scaffold Post title:string --no-migration

      invoke  active_record
      create    app/models/post.rb
      invoke  resource_route
       route    resources :posts
      invoke  scaffold_controller
      create    app/controllers/posts_controller.rb
      invoke    erb
      create      app/views/posts
      create      app/views/posts/index.html.erb
      create      app/views/posts/edit.html.erb
      create      app/views/posts/show.html.erb
      create      app/views/posts/new.html.erb
      create      app/views/posts/_form.html.erb
      invoke    helper
      create      app/helpers/posts_helper.rb

jets generate scaffold で、rails generate scaffold と同じような感覚で、アプリケーションのひな形を作成できます。

posts という DynamoDB のテーブルは事前に作ってあるので、モデル名は Post とし、title というカラムを一つ準備しました。

ただ、migration ファイルは事前に作ってあるので、RDB 用の migration ファイルは作成する必要がありません。そのため、オプションに --no-migration を追加しています。

Dynomite 用に処理修正

DynamoDB 用に処理が動くよう、Dynomite の使い方に合わせて処理を修正します。

ファイル修正内容のまとめは以下コミットログをご参照ください。

update processes for dynomite · gotchane/jets-dynamodb-app-sandbox@08bd12f · GitHub

また、Dynomyte のメソッドについては、Dynomite の README も併せてご参照ください。

Post モデル修正

app/models/post.rb
class Post < Dynomite::Item
  include ActiveModel::Validations

  column :id, :title
  validates :title, presence: true
end
修正内容
  • Post モデルの継承元クラスを、ApplicationRecordから、Dynomite::Item
  • column メソッドで idtitle への getter/setter メソッドを準備
  • ActiveModel::Validationsinclude し、バリデーションを可能に

Post コントローラ 修正

app/controllers/posts_controller.rb
class PostsController < ApplicationController
  before_action :set_post, only: [:show, :edit, :update, :delete]

  # GET /posts
  def index
    @posts = Post.scan
  end

  # GET /posts/1
  def show
  end

  # GET /posts/new
  def new
    @post = Post.new
  end

  # GET /posts/1/edit
  def edit
  end

  # POST /posts
  def create
    @post = Post.new(post_params)

    if @post.replace
      if request.xhr?
        render json: {success: true, location: url_for("/posts/#{@post.id}")}
      else
        redirect_to "/posts/#{@post.id}"
      end
    else
      render :new
    end
  end

  # PUT /posts/1
  def update
    if @post.replace(post_params)
      if request.xhr?
        render json: {success: true, location: url_for("/posts/#{@post.id}")}
      else
        redirect_to "/posts/#{@post.id}"
      end
    else
      render :edit
    end
  end

  # DELETE /posts/1
  def delete
    Post.delete(@post.id)
    if request.xhr?
      render json: {success: true}
    else
      redirect_to "/posts"
    end
  end

private
  # Use callbacks to share common setup or constraints between actions.
  def set_post
    @post = Post.find(params[:id])
  end

  def post_params
    params.require(:post).permit(:title).to_h
  end
end
修正内容
  • index 内のメソッドを Post.all から、Post.scan (DynamoDB テーブル全検索メソッド) に
  • create 内のメソッドを @post.create から @post.replace
  • update 内のメソッドを @post.update から @post.replace
  • destroy 内のメソッドを @post.destroy から Post.delete
  • post_params の戻り値のクラスを to_hHash に (ActionController::Parameters クラスのオブジェクトに対応していないため)

動作確認

ここまで修正できたら、動作するはずです。以下コマンドを実行し、アプリケーションを起動します。

$ webpack -w
$ jets server
index

image.png

new

image.png

show

image.png

edit

image.png

以上で検証は終わりです!

おわりに

この検証で、 scaffold といった、rails でお馴染みの機能を使いつつ、DynamoDB をテーブルにしたアプリケーションが作れそうだなと思いました。

ただ検証していて、scaffoldDynomite のマイグレーションファイル作ってくれないかなーといったことも感じましたが、これからもっと便利になっていくのではないかと思います。

参考

16
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
6