Blogロードバイク通勤のRubyプログラマで伊豆ダイバー。スタイルガイド(bbatsov/rails-style-guide)が良いまとめだなと思ったのですが、僕は英語が苦手なので辛いです。自分なりに日本語版を作っておくことにしました。自分の理解が不十分のところの訳文は特にヘンテコなままです。Requestください。この記事は古くなっています。miyamae/rails-style-guideを参照ください。序曲スタイルとは、偉人から良い所を分離したものである。3開発のための1セットのベストプラクティスおよびスタイル規則を示すことです。ガイドの中では「Railsアプリケーションのテスト」は「Railsアプリケーション開発」の後にあります。ソフトウェアを開発する最良の方法であると本当に信じています。それを覚えておいてください。Railsは信念の強いフレームワークです。これは信念の強いガイドです。心の中では、RSpecがTest::Unitより優れていると完全に確信しています。SassはCSSより優れています。(Slim)はErbより優れています。したがって、Test::Unit、CSS、Erbに関するどんな助言も、この中で見つけることは期待できません。3.1以上でのみ適用できます。Transmuterを使用して、PDFあるいはこのガイドのHTMLコピーを生成することができます。設定config/initializersにカスタム初期化コードを入れてください。initializersの中のコードはアプリケーション起動時に実行されます。各gemの初期化コードは、gemと同じ名前の個別のファイルにあるはずです。carrierwave.rb、active_admin.rbなどです。プリコンパイルの追加アセットを記します。)production環境に似た、staging環境を追加で作成してください。対して、さらにアクションを追加する必要がある場合、memberおよびcollectionルートを使用します。:collectionend複数のmember/collectionルートを定義する必要がある場合は、代替ブロック・シンタックスを使用します。endendActiveRecordモデルの関係をよりよく表現するために、入れ子のルートを使用してください。:commentsend関連するアクションをグループ化するためにnamespaceを使用してください。:productsend古い記法のワイルド・コントローラ・ルートを使用しないでください。このルートはGETリクエストによってアクセス可能なすべてのコントローラの中ですべてのアクションを生成します。':controller(/:action(/:id(.:format)))'コントローラコントローラは皮だけの状態を保ってください。これらは単にビュー層のためのデータを取り出すだけのものであるべきであり、ビジネスロジックを含むべきではありません。1つのメソッドだけを起動するべきです。コントローラーとビューの間の変数の共有は、2つを超えない範囲にしてください。モデル非ActiveRecordモデルのクラスは自由に導入してください。名前を付けてください。gemを使用してください。変更しないようにしてください。クラス定義の始めにまとめてください。:throughを好んでください。:throughを使うことは、結合モデルに対して追加の属性とバリデーションを許可します。カスタムバリデーションが2度以上使用されるか、バリデーションが正規表現マッチングである場合は、カスタムバリデータファイルを作成してください。trueendすべてのカスタムバリデータは共有gemに移動されるべきです。scopeは自由に使用してください。scopeと同じ目的のために、代わりにActiveRecord::Relationオブジェクトを返すクラスメソッドを作るのは望ましいことです。update_attributeメソッドの振る舞いに用心してください。(update_attributesと異なる)、容易にモデルの状態を悪くするかもしれません。ユーザー・フレンドリーなURLを使用してください。URLの中ではモデルのidではなく、モデルの記述的な属性を表示してください。このためのいくつかの方法があります。to_paramメソッドをオーバーライドしてください。これはオブジェクトへのURLを構築するためにRailsによって使用されます。デフォルト実装では、レコードのidを文字列として返します。他の「人間が判読可能な」属性を含めるために、これをオーバーライドすることができます。endURLフレンドリーな値に変換するために、文字列のparameterizeを呼ぶ必要があります。ActiveRecordのfindメソッドで見つけることができるように、オブジェクトのidが始めにある必要があります。gemを使用してください。これは、そのidの代わりにモデルの記述的な属性を使用することによって、人間が判読可能なURLを生成できるようにします。異なるフォーマットであるか、これらのフォーマットの付加的な解析が必要な場合、自分のカスタムフォーマットを作成して、クラスの中でそれを使用してください。...endリクエストが拡張子なしで送られるべきである場合は、ActiveResource::Baseのelement_pathとcollection_pathメソッドをオーバーライドし、拡張子部分を削除してください。endendさらにURLの他の修正が必要な場合、これらのメソッドをオーバーライドすることができます。マイグレーションschema.rbはバージョン管理下に置いてください。db:schema:loadを使用してください。db:test:prepareを使用してください。テーブル自体にデフォルトを設定しないようにしてください。モデル層を代わりに使用してください。up、downメソッドの代わりに、changeメソッドを使用することです。endendビュービューからモデル層を直接呼び出さないでください。ビューの中で複雑な体裁出力を作らないでください。ビューヘルパー、またはモデルのメソッドに体裁を出してください。部分テンプレートやレイアウトを使用してコードの重複を軽減させてください。このためのステップは次の通りです。ClientSideValidations::Middleware::Baseを拡張するカスタムバリデータを宣言します。end新しいファイルpublic/javascripts/rails.validations.custom.js.coffeeを作り、application.js.coffeeファイルに参照を追加します。rails.validations.customクライアントサイドバリデータを追加します。文字列や他のロケール固有の設定は、ビュー、モデル、コントローラで使用するべきではありません。これらのテキストはconfig/localesディレクトリ内のロケールファイルに移動するべきです。これらの属性の翻訳は、ビューのラベルとして使用されます。ActiveRecord属性の翻訳からのビューで使用されるテキストを分離してください。modelsフォルダの中にはモデル、viewsフォルダの中にはビューで使用されるテキスト用のローカルファイルを置いてください。追加ディレクトリからのローカルファイルの編成が完了したということは、これらのディレクトリはロードされるためにapplication.rbファイルで定義されているはずです。'*.{rb,yml}')]localesディレクトリのルート下のファイルに、日付や通貨の書式のような共有される地域化オプションを置いてください。I18nメソッドの短縮形を使用してください。I18n.translateの代わりにI18n.t。I18n.localizeの代わりにI18n.lです。ルックアップを使用してください。page"users.show.titleの値は、app/views/users/show.html.hamlテンプレートで次のように得ることができます。'.title':scopeオプションを指定する代わりに、コントローラとモデルをドットで区切ったキーを使用してください。ドットで区切った呼び出しは、読みやすく、階層のトレースがより簡単です。I18nのより詳細な情報は以下で見つけることができます。Guidesアセットアプリケーション内の構成にてこ入れするためにアセットパイプラインを使用してください。imagesのためにapp/assetsを使用してください。ような第三者のコードはvendor/assetsに置かれるべきです。可能な場合は、アセットをgem化したバージョンを使用してください。(例:jquery-rails)MailerMailerの名前はSomethingMailerとしてください。接尾辞のないMailerでは、どれがMailerか、どのビューがMailerと関係があるか、明白ではありません。HTMLとプレーンテキストの両方のビューテンプレートを提供してください。development環境中でメール配信に失敗した際のエラー発生を有効にしてください。エラーはデフォルトでは無効です。truedevelopment環境ではSMTPサーバにsmtp.gmail.comを使用してください。settings}ホスト名にデフォルト設定を与えてください。'your_site.com'メールの中でサイトへのリンクを使用する必要がある場合は、_pathメソッドではなく、常に_urlを使用してください。_urlメソッドはホスト名を含んでいますが、_pathメソッドは含んでいません。url_for(course_url(@course))FromとToのアドレスに適切な書式を使ってください。次のような書式を使ってください。methodにはtestが設定されていることを確認してください。methodにはsmtpが設定されていることを確認してください。:smtpいくつかのメールクライアントが外部スタイルの問題を抱えているため、HTMLメールを送るときは、すべてのスタイルがインラインでなければなりません。これはメンテンナンスを困難にし、コードの重複にもつながります。スタイルを変換し、それを対応するHTMLタグに挿入するための、2つの同じようなgemがあります。ページレスポンスを生成する間にメールを送ることは避けるべきです。ページの読み込みに遅延が発生しますし、もし複数のメールが送信されるのなら、リクエストがタイムアウトする場合があります。gemの助けを借りてバックグラウンドプロセスで送信します。Bundler開発またはテストのみ使用されるgemは、Gemfileの適切なグループの中に置いてください。プロジェクトでは定評のあるgemだけ使用してください。ほとんど知られていないgemを含めることを検討しているのなら、そのソースコードの注意深い調査を最初に行うべきです。OS特有のgemは、異なるOSを使用している複数の開発者と一緒のプロジェクトのために、頻繁に変わるGemfile.lockによって得ます。Xの特有のgemをすべてGemfileの中のdarwinグループに、Linux特有のgemをlinuxグループに加えてください。'rb-inotify'end正しい環境で適切なgemを要求するためには、config/application.rbに以下を加えてください。RUBY_PLATFORM.match(/(linux|darwin)/)[0].to_symBundler.require(platform)バージョン管理からGemfile.lockを取り除かないでください。これは任意に生成されたファイルではありません。installした時に、チームメンバーが確実にすべて同じgemバージョンを得るためのものです。有用なgem最も重要なプログラミングの法則の1つはこうです。「車輪を再発明するな!」。あるタスクに直面した時には、自分のものを広げる前に、常に既存の解決策を見つけるために周りを見回すべきです。ここにあるリストは、多くのRailsプロジェクトに役立つ「有用な」gemです。ActiveAdminがあれば、Railsアプリにおける管理者インタフェースの作成は子供の遊びのようなものです。UI、その他いろいろ。柔軟でカスタマイズ可能です。Capybaraは、Rails、Sinatra、MerbのようなRackアプリケーションにおける統合テストのプロセスを単純化することを目標としています。CapybaraはリアルユーザーのWebアプリケーションとの対話をシミュレートします。それはテストを実行するドライバーに関して不可知論者で、Rack::Testに付属し、Seleniumをビルトインでサポートしています。HtmlUnit、WebKit、env.jsは外部gemによってサポートされます。RSpecとCucmberとのコンビネーションで素晴らしい仕事をします。Railsにおける究極のファイルアップロードソリューション。アップロードファイルはローカルと、クラウドストレージの両方をサポートします。画像の後処理のためにImageMagickと素晴らしく統合します。サーバーサイドの既存のモデルバリデーションから、自動的にJavaScriptクライアントサイドバリデーションを生成する、素晴らしいgemです。いくつかのCSSフレームワークのサポートを追加する、素晴らしいgem。mixinsのコレクションが含まれています。Rubyで機能テストを開発するプレミアムツールです。cucumber-railsは、RailsへのCucumberの統合を提供します。Deviseは、Railsアプリケーションのフル機能の認証ソリューションです。カスタム認証ソリューションを展開するほとんどの場合、Deviseの使用が適しています。fabricationの代わり。成熟したfixtureの代替です。fabricationの精神を持っています。ダミーデータを生成する手軽なgem。高速で柔軟なRSS/Atomフィードのパーサー。ファイルの変更を監視し、それに基づいたタスクを起動する、素晴らしいgemです。多くの有用な拡張が載せられました。自動テストとwatchrよりはるかに優れています。haml-railsは、HamlのRailsへの統合を提供します。Erbよりはるかに優れいていると考えられています。素晴らしいページングソリューション。fixtureは楽しくありません。mechanistなら。RSpecはTest::MiniTestの代替です。私はRSpecを十分に強く推奨することができません。rspec-railsは、RSpecのRailsへの統合を供給します。使用したならば、あなたは決してRailsのデフォルト形式に関して聞かされたくありません。フォームを構築するためにマークアップに対して文句のない素晴らしいDSLを持っています。SimpleCovのためのRCovフォーマッタ。Hudsonのcontininousな統合サーバーとSimpleCovを使用しようとしているなら有用です。コードカバレッジツール。1.9と完全に互換性をもちます。素晴らしいレポートを生成します。Slimは簡潔なテンプレート言語です。(Erbには言及しない)。私が使用するのを止める重くて細いただ1つの理由は、主要なエディタ/IDEのサポートの不足です。そのパフォーマンスは驚異的です。テストするためのDRbサーバです。クリーンなテスト状態を保障するために各々の実行前にフォークします。簡単に言えば、多くのテスト環境を事前ロードします。その結果として、テストの最初の時間が大幅に減少します。SOLRによる全文検索エンジン。このリストは完全ではありません。他のgemは今後加えられるかもしれません。リストのgemはすべてフィールドテストされています。これらすべては活発な開発およびコミュニティ活動をしており、よいコード品質であることが知られています。欠陥のgemこれは問題があるか、他のgemによって取って代わられるgemのリストです。プロジェクトの中でこれらを使用しないようにするべきです。このgemはメモリ消費で悪名高い。テストを自動的に実行するための古いソリューションです。コードカバレッジツールです。1.9と互換性がありません。非常に大量のメモリを使用するので、本番環境でのこのgemの使用には強く反対します。このリストは作成途中です。他にもポピュラーであるが欠陥のあるgemを知っていれば教えてください。Railsアプリケーションのテスト新しい機能を実装するためのの最良のアプローチは、おそらくBDDアプローチです。書くことにより開始します。機能の実装を洗い出すためにこれらのテストを使用します。始めに機能用のビューのspecを書き、適切なビューを作成するためにそれらのspecを使用します。後でビューにデータを与えて、コントローラを実装するために、それらのspecを使用するコントローラ用のspecを作成します。最後に、モデルspecおよびモデル自身を実装します。タグを付けてください。これらのシナリオは無視され、失敗としてマークされません。保留中のシナリオの作業が完了し、テストするための機能性が実装されたら、テストスイートにこのシナリオを含めるために@wipタグを削除します。@javascriptタグが付いたシナリオを除外するようにデフォルトのプロフィールをセットアップしてください。それらはテストにブラウザを使用します。通常のシナリオの実行速度を上げるために、それらを無効にすることをお勧めします。@javascriptタグが付けられたシナリオのための別のプロフィールをセットアップしてください。プロフィールはcucumber.ymlファイルで設定することができます。@tag_nameプロフィールは次のコマンドで実行されます。古いweb_steps.rbステップ定義を使わないでください!WebステップはCucumberの最新バージョンで削除されています。その使い方は、適切にアプリケーションのドメインを反映しない冗長なシナリオの作成につながります。要素の存在を調べる場合。これは、i18nに関する問題を見つけることができます。...各々のフィーチャには3つの主成分があります。フィーチャについての短い説明。個々のステップから構成されたシナリオのセット。一般的なフォーマットがConnextraフォーマットとして知られています。...このフォーマットは最も一般的なものですが、必須ではありません、ナラティブはフィーチャの複雑さに応じて自由なテキストになりえます。シナリオのDRYを維持するために、シナリオアウトラインを自由に使用してください。|シナリオ用のステップはstep_definitionsディレクトリの下の.rbファイルにあります。ステップファイルのファイル名命名規則は[description]_steps.rbです。ステップは異なる基準に基づいた異なるファイルへ分けることができます。ために1ステップのファイルを持つことは可能です。ためにすべてのフィーチャの1ステップのファイルがさらにある場合もあります。繰り返しを回避するために複数行ステップ引数を使用してください。endendシナリオのDRYを保つために、複合ステップを使用してください。}end常にshould_not肯定の代わりにCapybaraの否定マッチャーを使用してください。Ajaxアクションをテストすることを可能にし、指定されたタイムアウトでマッチングの再試行を行います。多くの説明は、CapybaraのREADMEを参照してください。RSpecexampleごとに1つの期待値だけを使用してください。endenddescribeとcontextを多用してください。describeブロックの命名は次のようにしてください。