迅速な開発
「 40行のRubyを使用したTinyURLのクローン作成 」や「 SinatraとDataMapperを使用した15分でのクローンパスティー 」などの西洋のブログへの投稿に触発され、設計から導入までの軽量ルビーWebアプリケーションの実装プロセス全体を説明することにしました。
ツール
Rubyには、迅速な開発のための膨大な数の異なるツールがあります。 私は次のことに決めました。
Sinatra -Web用のDSL。 構成フレームワーク上の軽量の規則。 Webアプリケーションを迅速かつ簡単に開発でき、必要なものはすべて簡単に追加できます。 私たちのアプリケーションの基礎。
DataMapper -ORM、ActiveRecordの主要なライバル。 それは何かが劣っていて、前述のものを超えており、さまざまなデータベースで完全に動作し、構成と統合が簡単です。
HAML-プログラマー向けのHTML。 従来のerbよりわずかに美しいマークアップ言語は、クリーンで有効なxhtmlを生成します。 CSS- SASSに相当するものが含まれています。
Heroku-結果のアプリケーションを便利に、しかも無料で(もちろん制限付きで)配置できます。 オプションのツールで、どこにでも展開できます。
何を書きますか?
ツールを選択した後、私は考えましたが、実際には何を書くのですか? そして、私はこれが私の漫画を整理するためのツールになると決めました。 そのようなアプリケーションには、クライアント機能、管理パネル、サブスクリプション用のrssフィードの生成があり、開発のさまざまな側面に触れて、実際のタスクに近づけることができます。 まあ、私はウェブコミックも大好きです:)
コード解析
だから、私たちは最も興味深いことになります。 結果として得られるコードのほとんどすべては理解しやすく、 githubで見つけることができます。 全体像を示すためにそれを開くことをお勧めします。最も重要なコードフラグメントと、実装でいくつかの困難を引き起こしたこれらのフラグメントについて詳しく説明します。
まず、プロジェクト構造を分析します。これは非常に簡単です。
comics.rb
config.ru
models.rb
公開
景色
models.rbファイルには、モデル、データベース構成、およびその操作に関連するすべてが含まれています。 comics.rbには、シナトラのすべてのコードが含まれています。 また、デフォルトでは、Sinatraは、webからアクセス可能なファイル(javascript、イメージ)を使用して、hamlおよびpublicのビューを含むビューフォルダーを選択します。
モデルから始めましょう。
models.rb
DataMapper. setup ( :default , ENV [ 'DATABASE_URL' ] || "sqlite3:///#{Dir.pwd}/comics.db" )
herokuのデータベースパラメーターはENV ['DATABASE_URL']に含まれており、そのような変数がない場合は、プロジェクトのあるディレクトリにsqliteデータベースを作成します。 ソースを編集する必要はありません。
models.rb
- クラス DateTime
- def rfc822
- 自己 。 strftime "%a、%d%b%Y%H:%M:%S%z"
- 終わり
- 終わり
RSS 2.0仕様では、RFC#822形式の日付が必要です。 これを行うには、DateTimeクラスのオブジェクトにrfc822メソッドを追加します。これにより、タイムスタンプが必要な方法でフォーマットされ、プレゼンテーションで今後使用されます。
comics.rb
- defが保護されました!
- response [ 'WWW-Authenticate' ] = % ( Basic ) および \
- throw ( :halt 、 [ 401 、 "認証されていない ] ) および \
- 許可されていない限り 返品 ?
- 終わり
- defは承認されましたか?
- コミック=コミック。 最初に
- @auth || = Rack :: Auth :: Basic :: Request 。 新規 ( request。env )
- @auth 提供 ? && @auth 。 基本的な ? && @auth 。 資格情報 && @auth 資格情報 == [コミック。 ログイン 、コミック。 パスワード ]
- 終わり
Sinatraのシンプルな認証実装。 FAQからほぼ完全に取られていますが、違いは、ユーザー名とパスワードがソースに配線されるのではなく、データベースから取られることです。 使用するのは非常に簡単です。認証を必要とするアクションにprotectedを入力するだけで十分です。
comics.rb
- get '/rss.xml' do
- content_type 'application / rss + xml' 、:charset => 'utf-8'
- @comics =コミック。 最初に
- @strips =ストリップ。 all :制限 => 10
- haml ( :rss 、: layout => false )
- 終わり
RSSフィードの戻り。 Content-Typeを変更し、layout => falseを追加して、フィードがレイアウトでレンダリングされないようにします。
ビューにいくつかのヒントがあります。
layout.haml
- % title = "#{@comics.title}-#{@strip.title}" rescue @comics 。 タイトル
ここで例外メカニズムを使用しない場合、 @ strip変数を空にすると、 nilクラスにはtitleメソッドがないため、 NoMethodErrorエラーが発生します。 摩擦では、そのようなことは常に念頭に置いておく必要があります。
models.rb
- クラスストリップ
- #プロパティを宣言
- def next
- ストリップ。 最初 ( :created_at。gt => self。created_at ,: order => [ :created_at。asc ] )
- 終わり
- def previous
- ストリップ。 最初 ( :created_at。lt => self。created_at )
- 終わり
- def get_id
- 自己 。 id
- 終わり
- default_scope ( :デフォルト ) 。 更新 ( :order => [ :created_at。desc ] )
- 終わり
layout.haml
- -tonext = "/#{@strip.next.get_id}" レスキュー "#"
- -toprevious = "/#{@strip.previous.get_id}" rescue "#"
メカニズムは理解できます-現在見ているものの次と前のストリップを検索し、ビューへのリンクを表示します。 既存のIDを直接使用する代わりに、別個のget_idメソッドを作成する必要があったのはなぜですか? 実際、現在最後のストリップを見ると、 nextメソッドはnilを返します。 そしてnilにはidメソッドがあり、長い間「4」を返すと思います。 これは、irbを試して自分で確認できます。
解析でこれを終了できます。コードに関するご質問にお答えします。コメントでの批判に対応します。
展開
書かれたアプリケーションは、 ruby comics.rbチームでSinatraの他のアプリケーションと同様に簡単に起動します。 しかし、私たちはそれを世界に見せたいと思っています。Herokuはこれを手伝ってくれます。 herokuに登録し、gem herokuをローカルマシンにインストールします。 次に、Rackの構成を作成します。
config.ru
- 「コミック」が 必要
- Sinatraの実行::アプリケーション
次のステップは、herokuでアプリケーションを作成し、そこにコードをプッシュすることです。 アプリケーションが既にgitリポジトリにあることに同意しましょう:
heroku create comics
git push heroku master
データベースに初期データを入力するだけです。これには、 models.rbにインストール方法があります。
Herokuコンソール
インストールする
それだけです。アプリケーションを作成するときにgemが発行したアドレスに移動し、すべてが正しく行われたら結果を楽しんでください。
参照資料
GitHubのコミック
Herokuのデモ ( 管理者 、habrpostでのリクエストに応じたパスワード)。