プラグインの作成方法を学び、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は、「構成より規約」の原則の本質を明確に示しています。プログラムを機能させるためにコードを記述する必要はありません。プログラムが通常どおり機能しない場合にのみコードが必要です。 例:
- 別の名前のテーブルを使用する必要があります-クラスに行
set_table_name "mytablename"
を追加します - テーブル内のフィールドが曲がっている-おそらくフィールドの通常の名前でアクセスメソッドを書く方が良いでしょう
- 1つのオブジェクトが複数のテーブルにマッピングされます-ORMを作成する必要があります:)
ActiveRecordには多くの便利な機能がありますが、そのうちのいくつかを以下に示します。
-
Article.find(id)
記事を検索します(データベース内の主キー。通常は整数です) -
Article.find(:all)
-すべての記事を選択 -
Article.find_by_title('Hello World!')
-タイトルが「Hello World!」の記事を検索します -
Article.create(:title => 'Hello World!')
-記事を作成してデータベースに保存する -
article.update(:title => 'Goodbye World!')
-データベース内の記事を更新します -
article.destroy
データベースから記事を削除する
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はいくつかのファイルを生成しました。そのうちのいくつかを見てください。
-
app/models/article.rb
記事のモデル -
app/controllers/articles\_controller.rb
記事ディレクトリを管理するためのコントローラー -
config/routes.rb
行map.resources :articles
追加map.resources :articles
-
app/views/articles/...
...-記事を作成、編集、表示するためのビュー -
app/views/layouts/articles.rhtml
ディレクトリを操作するためのページテンプレート -
db/migrate/001_create_articles.rb
データベース内の記事のテーブルを作成する
モデルでは、すべてが明確であると思うので、コントローラーを見てみましょう。 コントローラーには7つのメソッドがあります。
-
index
ページには記事のコレクション全体が表示されます -
show
ページに1つの記事が表示されます - new-新しい記事を作成するためのページ
-
edit
-既存の記事を編集するためのページ -
create
新しい記事を作成するためのフォームのポストハンドラー -
update
-記事編集フォームの投稿ハンドラー -
destroy
記事の削除リクエストハンドラー
config/routes.rb
map.resources :articles
行には、必要なURLルーティングルールが追加されています。 作成されたURLは次のようになります。
-
/articles (GET)
-インデックス -
/articles/:id (GET)
(:id-記事の識別子) -
/articles;new (GET)
-新規 -
/articles/:id;edit (GET)
-編集 -
/articles (POST)
-作成 -
/articles/:id (PUT)
-更新 -
/articles/:id (DELETE)
-destroy
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
フォルダーに表示されます。 中身は何ですか:
-
lib
このフォルダーにはコードが含まれています -
lib/acts_as_formatted.rb
プラグインコードがあります -
tasks
-プラグインは、Rakeのタスクを追加できます。それらは一般リストに表示されます -
test
-プラグインは十分にテストする必要があります -
init.rb
このファイルはブート時に実行され、ここからlib
あるプラグインファイルが含まれます -
install.rb
、uninstall.rb
これらのファイルはプラグインのインストールおよび削除中に実行されますが、必要ありません -
Rakefile
プラグインのRakeタスクを含むファイル(テストの実行とドキュメントの生成)
現在、フォーマット用のコードを記述し、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つのモジュールで構成されます。
-
ActiveRecord::Acts::ActsAsFormatted::Formatting
-フォーマットを担当するコード -
ActiveRecord::Acts::ActsAsFormatted::ClassMethods
唯一のメソッドはacts_as_formatted
、このモジュールはActiveRecord::Base
追加されます
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>
-
gems:link
アプリケーションのロード時にgemをロードするvendor/gems
コードを追加しますvendor/gems
がない場合、アプリケーションはロードされません(gemが存在しないことを操作中にではなく、すぐに知るのが便利です) -
gems:freeze
-gemのローカルコピーを作成します。このコピーはアプリケーションで使用されます -
gems:unfreeze
-gems:link
によって生成されたローカルコピーとコードを削除します
アプリケーションに必要なgemのローカルコピーを作成しましょう。
<code> $> rake gems:フリーズGEM = maruku $>レーキ宝石:フリーズGEM = redcloth </ code>
maruku-0.5.6
および
RedCloth-3.0.4
フォルダーが、
vendor/gems
フォルダーに表示されました。
以上です。 質問をして、 ドキュメントやレールに関する本を読んでください。
主なことは、コードを書くことです!
PS。 最後の行を書いているときに、レールに関するスクリーンキャストがある興味深いサイトに出会いました。