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。 最埌の行を曞いおいるずきに、レヌルに関するスクリヌンキャストがある興味深いサむトに出䌚いたした。

Source: https://habr.com/ru/post/J12570/


All Articles