Ruby on Railsの紹介(パート2)

Ruby on Railsを理解する」という記事の続きでは、データベースを操作して記事のカタログを作成する方法を学習します。

プラグインの作成方法を学び、AJAXを使用してみて、ホスティングにアプリケーションをデプロイする際のいくつかの問題を検討します。



データベースから始めましょう。





私はMySQLを使用しているため、インストール例がMySQLに使用されます。



Windowsユーザーは、 MySQL-5.0をダウンロードしてインストールする必要があります。



Linux(Ubuntu)ユーザーの場合、さらに簡単です:



  <code class = 'sh' lang = 'sh'> $> sudo apt-get install mysql-server-5.0 libmysql-ruby </ code> 




インストール後、サーバーが機能していることを確認します。



  <code class = 'sh' lang = 'sh'> $> mysqladmin ping -u root
 mysqldは動作しています</ code> 




適切なデータベースを作成するときが来ました。 開発用とテスト用の2つが必要です。



  <code class = 'sh' lang = 'sh'> $> mysqladmin create example_development -u root
 $> mysqladmin create example_test -u root </ code> 




それではconfig/database.yml



ファイルを見てみましょう。 以下は、データベースに接続するためのパラメーターです。 通常、何も変更する必要はありません。デフォルトでは、mysqlはすべての権限とパスワードなしでrootユーザーを作成します。



データベースとアプリケーションの接続をテストするために残ります。 アプリケーションフォルダーに移動して入力します



  <code class = 'sh' lang = 'sh'> $>レーキ</ code> 




エラーメッセージが表示される場合、接続設定のどこかで間違いを犯したことを確認してください。



データベースの操作の概要。





Railsでのオブジェクトとデータベースの接続は、 ActiveRecordと呼ばれるORマッパーを使用して実行されます。 彼は、データベーステーブルからオブジェクトのフィールドへのフィールドのマッピング、保存前のオブジェクトの検証、オブジェクト間の関係を表すコード生成を扱います。



新しいモデルを作成するには、 ActiveRecord::Base



クラスから継承するだけで十分です。



  <code class = 'ruby' lang = 'ruby'> class Article <ActiveRecord :: Base
終了</ code> 




デフォルトでは、ActiveRecordはクラスとしても名前が付けられたテーブルを複数形でのみ使用します。 私たちの場合、記事。



テーブル内のすべてのフィールドには、同じ名前のメソッドを使用してアクセスできます。



  <code class = 'ruby' lang = 'ruby'>#Articlesテーブルにタイトルフィールドがあるようにする
 Article.create(:title => 'Hello World!')
 article = Article.find(1)
 article.titleを印刷
 #=> Hello World!</ code> 




ActiveRecordは、「構成より規約」の原則の本質を明確に示しています。プログラムを機能させるためにコードを記述する必要はありません。プログラムが通常どおり機能しない場合にのみコードが必要です。 例:







ActiveRecordには多くの便利な機能がありますが、そのうちのいくつかを以下に示します。







ActiveRecordおよびインストールされている他のgemのドキュメントを表示するには、実行する必要があります



  <code class = 'sh' lang = 'sh'> `$> gem_server` </ code> 




ブラウザで開きます



http:// localhost:8808 /



次に、ディレクトリを作成してみましょう。





script/generate



を使用して、ディレクトリのモデル、コントローラー、ビューを作成します。



  <code> $> ruby​​スクリプト/ scaffold_resourceの記事を生成title:string body_format:string body:text </ code> 




テキストにソースコードを含めないので、記事を膨らませないように、 オンライン表示できます。さまざまなコードが必要な理由を説明します。



Railsはいくつかのファイルを生成しました。そのうちのいくつかを見てください。







モデルでは、すべてが明確であると思うので、コントローラーを見てみましょう。 コントローラーには7つのメソッドがあります。







config/routes.rb



map.resources :articles



行には、必要なURLルーティングルールが追加されています。 作成されたURLは次のようになります。







PUTおよびDELETEは、GETやPOSTなどのHTTPメソッドです。

したがって、コレクションを管理するために必要なすべてのメソッドを、ユーザーが理解できる小さなURLセットに収めることができました。



アプリケーションをリソースセットに分割し、リソースにアクセスするための汎用形式(URLを作成する方法)を提供する原理はRESTと呼ばれます。 アイデアは、リソースの操作にステートレスプロトコルを使用することです(必要な情報はすべてURLに含まれています)。これにより、アプリケーションのスケーラビリティが向上し、キャッシュが簡素化されます。



リソースはURLによって明確に識別されるため、アプリケーションの主な作業は2つのタスクに削減されます。URLで示されるリソースをユーザーページに提供し、リソースがパブリックでない場合はアクセス権を確認します。 したがって、RESTスタイルのWebアプリケーションの作成と保守は非常に簡単です。



結果を見てみましょう、サーバーを起動します



  <code class = 'sh' lang = 'sh'> `$> ruby​​ script / server` </ code> 




そして行く



http:// localhost:3000 /記事



私はこのエラーを受け取りました:



  <code> Mysql ::エラー:テーブル 'example_development.articles'は存在しません:SELECT * FROM記事</ code> 




データベースにはarticles



テーブルがありません;あなたはそれを作成しなければなりません。



Railsのデータベーステーブルへの変更は、移行メカニズムによって行われます。 Railsは、 articles



テーブル( db/migrate/001_create_articles.rb



)を作成するために1つの移行を生成しました。 データベースに適用し、アプリケーションフォルダーに移動して実行する必要があります



  <code> $> rake db:移行</ code> 




移行の結果、articlesテーブルがデータベースに作成され、F5ブラウザーをクリックしてアプリケーションを試すことができます。



Rakeについて一言。





Rakeは、 make



ant



maven



などのユーティリティの代替品です。

Rakeが私たちのためにできることを知るには、次のことをしてください。



  <code class = 'sh' lang = 'sh'> $> rake -T </ code> 




Rakeで実行できるタスクの長いリストを入手してください。 タスクはRubyで記述され、 Rakefileファイルにあります。 最初は、ファイルにはrequire 'tasks/rails'



を使用して接続されている標準のタスクセットのみが含まれています。 db:migrate



タスクの説明の例を次に示します。



  <code class = 'ruby' lang = 'ruby'> desc「db / migrateのスクリプトを使用してデータベースを移行します。VERSION= xで特定のバージョンをターゲットにします」
タスク:移行=>:環境do
   ActiveRecord :: Migrator.migrate( "db / migrate /"、ENV ["VERSION"]?ENV ["VERSION"]。To_i:nil)
   Rake ::タスク["db:schema:dump"]。ActiveRecordの場合に呼び出す:: Base.schema_format ==:ruby
終了</ code> 




Rakeの素晴らしい点は、タスクの説明が通常のRubyコードであることです。 これにより、 ant



またはmaven



と比較して、新しいタスクの追加が大幅に簡素化されます。



Martin Fowlerには Rakeに関する優れた記事があります。



必要に応じて、Rakeについて知ることができます。 これで、 db:migrate



タスクが移行をトリガーし、変更を適用およびロールバックできることがすでにわかりました。 db/migrate/001_create_articles.rb



を見ると、 CreateArticles



クラスにはupとdownの2つのメソッドがあることがdb/migrate/001_create_articles.rb



。 これらのメソッドは、移行が適用され、それに応じてロールバックされるときに呼び出されます。 ファイル名の番号001



は移行のシリアル番号であり、移行の適用順序を決定するために使用されます。一方、レールは1回の移行を数回適用しないようにデータベースにバージョンを保存します。 データベースを特定のバージョンにdb:migrate



は、 db:migrate



をVERSIONパラメーターで実行する必要があります。



  <code> $> rake db:migrate VERSION = 0 </ code> 




その結果、テーブルがまだ作成されていない場合、データベースはバージョン0に移行します。 これは、アプリケーションを試した後にデータベースをクリアする便利な方法です。 その後、 db:migrate



を呼び出すことができますdb:migrate



パラメーターなしで再度移行すると、すべての移行が適用されます。



カタログは素晴らしいですが、記事はフォーマットされていません。





すでにカタログを見て、これを確認してください。 アプリケーションの主なタスクに取り組む時間-記事のフォーマット。



書式設定のためのコードはすでにありますが、今ではその使用方法を理解する必要があります。 最初のバージョンでは、コントローラーしかなかったため、コードが直接配置され、 Article



モデルが表示されるようになりましたが、コードをモデルに配置すると、書式設定が特定のモデルに厳密に関連付けられ、コードを再利用できなくなるという事実につながります、フォーマットされるモデルに依存しませんが。



プラグインを作成します。





Railsでは、これはアプリケーションに機能を追加する自然な方法です。 この場合、書式設定コードはモデルから分離され、他のアプリケーションで使用できるようになります。



プラグインが、たとえば次のような不要な単語なしでフォーマットのサポートを提供するようにします。



  <code>クラスArticle <ActiveRecord :: Base
   acts_as_formatted:body
終了</ code> 




この場合、ソーステキストはbody



フィールドにあり、 body_as_html



メソッドを使用して記事のフォーマットされたテキストを取得できます。 記事が記述される形式は、 body_format



フィールドにあります。



始めましょう。 まず最初に、プラグインスケルトンを作成するためにレールを信頼します。



  <code> $> ruby​​ script /プラグインacts_as_formattedを生成</ code> 




vendor/plugins



は、 vendor/plugins



フォルダーに表示されます。 中身は何ですか:







現在、フォーマット用のコードを記述し、ActiveRecordにサポートを追加します。



どうやってやるの? タスクは、 acts_as_formatted



メソッドをActiveRecord::Base



に追加することです。 このメソッドでは、フォーマットをサポートするために必要なコードを生成します。 これを行うには、Rubyでこれを行う方法を知る必要があります。



Rubyの既存のクラスに機能を追加する方法。





Rubyでは、すべてがこの単純なプログラムのオブジェクトです。



  <code class = 'ruby' lang = 'ruby'> print "Hello World!" </ code> 




オブジェクトのメソッドが呼び出されます。 どのオブジェクトですか? これはタイプモジュール(名前空間、パッケージのアナログ)のオブジェクトであり、グローバルモジュールはカーネルと呼ばれます。 モジュールはクラスに似ていますが、メソッド、定数、および他のモジュールとクラスのみを含めることができるという点で異なります。 同時に、rubyを使用すると、モジュールを他のモジュールとクラスにミックス(ミックスイン)できます。これは、モジュールとクラスのextend



および組み込みメソッドを使用して行われます。たとえば、



  <code class = 'ruby' lang = 'ruby'> class MyClass
  列挙可能を拡張する
終了</ code> 




または



  <code class = 'ruby' lang = 'ruby'> class MyClass
終わり

 MyClass.extend(列挙可能)</ code> 




同時に、 Enumerable



モジュールで定義されているすべてのメソッド、定数、クラス、およびモジュールがMyClass



クラスに表示されEnumerable







プラグインを作成しています。





ほとんどすべてのプラグインコードは、 acts_as_formatted.rb



ファイルにあります。



プラグインは2つのモジュールで構成されます。







acts_as_formatted



メソッドのacts_as_formatted



見てみましょう。

最初に、サポートされている形式と使用されるフィールドを確認し(この場合、 body



body_format



body_as_html



)、次に検証ルールを追加して、形式フィールドに有効な形式が含まれていることを確認し(検証が失敗するとオブジェクトを保存できません)、2つのメソッドをクラスに追加しますサポートされているフォーマットとフォーマットされたフィールド( supported_formats



body_as_html



)をbody_as_html



します。



すべてのフォーマット作業は、 ActiveRecord::Acts::ActsAsFormatted::Formatting



モジュールで行われます。 テキストをフォーマットするメソッドがあります: format



format_markdown



およびformat_textile



、およびモジュール内のメソッドに基づいてサポートされるフォーマットを決定するsupported_formatsメソッド。



ここで、 init.rb



に初期化コードを追加します。



  <code class = 'ruby' lang = 'ruby'> require 'acts_as_formatted'

 ActiveRecord :: Base.extend(ActiveRecord :: Acts :: ActsAsFormatted :: ClassMethods)</ code> 




そして、あなたはビジネスでプラグインを試すことができます。 書式設定されたテキストを表示するには、ビューを修正する必要があります。



ビューをくまなくプレビューします





まず、新しいフォームと編集フォームでコードの重複を取り除き、記事の作成と編集に使用できる1つのフォームを作成します。 フォーム間の唯一の違いは、URLと送信方法です。 したがって、フォームの使用方法に応じて、編集や記事の作成のために、URLとメソッドを決定する補助メソッドを作成すると便利です。



補助メソッドの場合、レールはヘルパーモジュールによって作成されapp/helpers/application_helper.rb



。コードはapp/helpers/application_helper.rb



edit_form_for



メソッドは、モデルが既に保存されているかどうかを判断し、これに応じて、モデルを作成または更新するためのフォームを生成します。 submit_edit



およびcancel_edit



は、フォームを送信cancel_edit



ためのボタンと、フォームから戻るためのリンクを作成します。



次に、フォームのビューを作成します。 レール内の再利用可能なビューの部分は、パーシャルと呼ばれます。 部分的なファイル名はアンダースコアで始まります。 通常、それらはそれらを使用するビューと同じ場所にあります



このようなリファクタリングの後、 new



ビューとedit



ビューのコードは非常に単純になり、1行になります。



  <code class = 'ruby' lang = 'ruby'> <%= render:partial => 'article' ,: object => @ article%> </ code> 




プレビューを追加します。 これを行うには、記事の書式設定されたテキストを返すコントローラーpreview



メソッドを作成します。



  <code class = 'ruby' lang = 'ruby'> def preview
   article = Article.new(params [:article])
   render_text article.body_as_html
終了</ code> 




次に、ルーティングテーブルにルールを追加します。



  <code class = 'ruby' lang = 'ruby'> map.resources:記事、
               :コレクション=> {:プレビュー=>:任意} </ code> 




2行目は、url /articles;preview



ルールを追加し/articles;preview



:collection



は、どのURLでプレビューが生成されるかは重要ではないため、コレクションURL( /articles



)が使用されることを意味します。 :collection



代わりに、 :collection



:member



を使用できます。URLは特定の記事( /articles/:id



)になります。この場合、作成された記事をプレビューすることはできません。 :any



は、任意のHTTPメソッドを使用して呼び出すことができることを意味します。この場合、作成時にPOSTが使用され、編集時にPUTが使用されます。



次に、フォームにサポートを追加します。 コードでビューを煩雑にしないために、補助メソッドを作成します。 このメソッドはボタンを作成します。クリックすると、フォームが非同期でサーバーに送信され、メソッドに渡された要素に応答が表示されます。 ビューにフォーマットされた記事を表示するためのボタンと要素を追加することは残っています



プレビューボタンはプロトタイプライブラリを使用してリクエストをサーバーに非同期的に送信するため、ページテンプレートにその読み込みを追加する必要があります



  <code class = 'ruby' lang = 'ruby'> <%= javascript_include_tag 'prototype'%> </ code> 




これで、2番目のバージョンの機能は完了したと見なすことができます。



これで、最初のバージョンから残っているコードを削除できます。



  <code>スクリプト/コントローラー入力プレビューを破棄</ code> 




そして最後に。



ホスティング事業者へのアプリケーションのインストールについて少し説明します。





自宅ですべてがあなたのために働くことが起こるかもしれませんが、断固としてホスティングを拒否します。 多くの理由があるかもしれませんが、それらの最も一般的なのは、いくつかの宝石が見つからないか、ホストのバージョンが間違っていることです。 これは、レール自体と、アプリケーションが依存するgemの両方に適用されます。



まず、レールへの依存を扱います。 アプリケーションをホスティングにアップロードする前に、次のことを行うと非常に便利です。



  <code> $>レーキレール:freeze:gems </ code> 




その結果、アプリケーションを開発しているRailsのコピーがvendor/rails



フォルダーに表示され、サーバーがそれを使用するため、ホストのバージョンを気にする必要がなくなります。



レールに加えて、アプリケーションは多くの場合、いくつかの宝石に依存します。この例では、RedClothとMarukuです。 これらの依存関係の問題を解決するために、 Nic博士はすばらしいプラグイン-Gems on Railsを書きました。 同じ原理で動作します-gemのローカルコピーを作成します。 それをインストールして使用方法を学びましょう:



  <code> $> gem install gemsonrails </ code> 




アプリケーションのあるフォルダーに移動して実行します



  <code> $> gemsonrails
 gems_on_rails 0.6.4を./vendor/plugins/gemsonrailsにインストールしました</ code> 




これで、 Gems on Railsプラグインがインストールされ、Rakeに役立つタスクが追加されました。



  <code> $> rake -T
 ...
 rake gems:freeze#RubyGemをこのRailsアプリケーションに固定します。  init.rbは起動時にロードされます。
 rake gems:link#RubyGemをこのRailsアプリケーションにリンクします。  init.rbは起動時にロードされます。
 rake gem:unfreeze#このRailsアプリケーションからRubyGemをフリーズ解除/リンク解除します
 ... </ code> 








アプリケーションに必要なgemのローカルコピーを作成しましょう。



  <code> $> rake gems:フリーズGEM = maruku
 $>レーキ宝石:フリーズGEM = redcloth </ code> 




maruku-0.5.6



およびRedCloth-3.0.4



フォルダーが、 vendor/gems



フォルダーに表示されました。



以上です。 質問をして、 ドキュメントレールに関する本を読んでください。



主なことは、コードを書くことです!





PS。 最後の行を書いているときに、レールに関するスクリーンキャストがある興味深いサイトに出会いました。



All Articles