私自身、そして他の誰かのレール・オン・レールを見ると、特定のレール技術を使用する未実現の機会をしばしば目にします。 私とあなたのためのリマインダーとして、アプリケーションとコードの効率を改善するためのいくつかのヒントとコツをリストしたいと思います。
コントローラでの速度の測定は非常に簡単です。 どのモデルでもベンチマーク手法を使用します。
User.benchmark(「1000ユーザーの追加と削除」) 1000回 User.create(:name => 'something') x = User.find_by_name( 'something') x.destroy 終わり 終わり
もちろん、コードの方が優れています;-)通常のSQLログはベンチマークメソッド内に書き込まれず、結果のみが書き込まれます。
acts_as_nested_set-ほとんどの人(ho-ho)は acts_as_treeに非常に精通していますが、 acts_as_nested_setはいつの間にかレールに現れました。 これは、acts_as_treeに似ていますが、利便性があります。1つのノードのすべての子(およびその継承者)を一度に選択できます。 メソッドのリストがあります 。
to_procを使用した単純なコレクション
post.collect { |p| p.title }
post.collect { |p| p.title }
または
post.select { |p| p.activated? }.collect{ |p| p.title}
post.select { |p| p.activated? }.collect{ |p| p.title}
post.select { |p| p.activated? }.collect{ |p| p.title}
? 小さなハックを使用して、文字を手順に変換します。
post.collect(&:title)
または
post.select(&:activated?).collect(&:title)
を記述できます。 ここでそれについてもっと 。
配列をセンテンスに変換する - ビューに名前のリストを表示する必要がある場合は、タイプ
['Peter', 'Fred', 'Chris']
配列を取得し、コンマで接続し、最後の1つの前に「and」を追加します。
to_sentence
メソッドは急いで助けになります:
names.to_sentence
は
"Peter, Fred, and Chris"
を返します。 (はい、これは移植性がなく、英語中心ではありません。これに関する元の記事への注で。)
ユーザーへのファイルの送信 -通常、静的ファイルは、レールアプリケーションをバイパスして直接URL経由で転送されます。 ただし、状況によっては、特に電子書籍のような価値のあるものを送信する場合は、ファイルの場所を非表示にすると便利な場合があります。 ログインしたユーザーのみにファイルの送信を制限する必要がある場合もあります。 この問題は
send_file
によって解決され
send_file
。 ファイルは4096バイトで送信されるため、大きなファイルでもシステムの速度が低下することはありません。
RJSを介してページ要素を取得する-RJSで要素を変更するのは簡単ですが、どの要素を変更する必要があるかわからず、CSSリクエストで対処したい場合はどうでしょうか。 これはselectメソッドで可能です。 たとえば、
page.select('#items li').each { |item| item.hide }
page.select('#items li').each { |item| item.hide }
。 強力なもの!
存在チェック -Model.find(id)を実行すると、id要素が見つからなかった場合に例外を取得します。 これを回避するには、まずModel.exists?(Id)を実行して、存在するかどうかを確認します。
一般的なタスクの数値ヘルパー -ほとんど使用されませんが、それでも非常に便利です:
number_to_currency(1234567.948) # => $1,234,567.95
または
human_size(1234567890) # => 1.1GB
または
number_with_delimiter(999999999) # => 999,999,999
他にもあります。 (ローカライズに関する同じ意見。)
簡単なルーティングテスト -test_routing-実験用のroutes.rbのデフォルトの「ルート」を置き換えるヘルパー。 例:
with_routing do | set | set.draw {set.connect ':コントローラー/:id /:アクション'} assert_equal( ['/ content / 10 / show'、{}]、 set.generate(:controller => 'content' ,: id => 10 ,: action => 'show') ) 終わり
詳細はこちら 。
リクエストに関する多くの興味深いこと
request.post?
そして
request.xhr?
-POSTおよびAjaxリクエストを見る一般的な方法ですが、それほど有名ではないものもあります。 たとえば、
request.subdomains
は認証に使用できるサブドメインの配列を返し、
request.request_uri
は完全なローカルURIを、
request.host
は完全修飾ホスト名を、
request.method
はメソッドを小文字で、
request.ssl?
を返し
request.ssl?
SSLかどうかを判断します。
パフォーマンスのさらなる改善 -デフォルトでは、railsはローカルファイルシステムでセッションを記録します。 多くの場合、これをActiveRecordStoreに変更して、データベースにセッションを記録します。 Memcachedはさらに高速な代替手段になりますが、インストールはそれほど簡単ではありません(サーバーが見知らぬ人などの場合は機能しません)。 それでも、 Stefan Kaes SQLSessionStoreを使用することで、ActiveRecordStoreよりも高速に実行できます。 このプラグインは、SQLセッション保存技術によりActiveRecordStoreの欠点を回避します。
起動時の静的コンテンツのキャッシュ -再起動ごとに変わらないデータがある場合は、キャッシュします。 たとえば、アプリケーション設定のある/ config-eのYAMLまたはXMLファイルで、environment.rbの定数にロードして、アクセスをより速く簡単にすることができます。
HTMLの検証(X)は万人向けではありませんが、出力が有効な場合、ビューが正しくレンダリングされる可能性があります。 Scott Raymondは、機能テストに使用できるassert_valid_markupヘルパーを開発しました。
HTML出力のよりきちんとしたテスト -Hpricotパーサーをwhy ( why )から特別なテスト拡張機能と組み合わせ、assert_equal
assert_equal "My title", tag('title')
または
assert element('body').should_contain('something')
などの強力なテストを取得し
assert element('body').should_contain('something')
。 これは、カスタムテンプレートのテストに最適です。 とにかく、
assert_tag
よりも
assert_tag
!
長いプロセスをバックグラウンドで個別に実行します -Ezra Zygmuntovich( Ezra Zygmuntovich )の小さなフレームワーク
BackgrounDRb
があります。これはデーモンとして実行され、レールアプリケーションからタスクを受け入れ、独立して実行します。 レターの送信、URLの受信、およびメインアプリケーションのリクエストの実行時間を遅くする可能性のあるその他のものに役立つ強力なもの。 デモタスクは変数を1増やし、その後1秒間
sleep
します。 次に、この変数をポーリングするrailメソッドを作成し、違いを感じます。 ここにもっとあります。
URLの美しい
to_param
モデルの
to_param
を置き換え、URLに対して
"#{id}-#{title.gsub(/[^a-z0-9]+/i, '-')}"
ようなものを返しますのような
yoursite.com/posts/show/123-post-title-goes-here...
yoursite.com/posts/show/123-post-title-goes-here...
ユーザーにとってははるかに快適であり、非デジタル文字が
Post.find(params[:id])
に
Post.find(params[:id])
ため、
Post.find(params[:id])
で何も変更する必要はありません。 完全な説明はこちら 。 (リンクが切れているようです)
エンジンへの機能の一部の分離 -誰もがプラグインについて聞いたことがありますが、残念ながら、エンジンを使用する人はほとんどいません! Enginsは、ステロイド( またはバルビツール酸塩 )のプラグインです。 独自のモデル、コントローラー、およびディスプレイを使用でき、任意のアプリケーションと統合できます。 これにより、共通の機能(ログイン、ユーザー管理、コンテンツ管理など)を、異なるプロジェクトに数分で含めることができる個別の「エンジン」にハイライトできます。 愚かなログインを書くことはありません! エンジンはクールですが、もっとクールでなければなりません。
計算 -テーブル内のデータの最大、最小、平均、量を計算しますか? これは、
ActiveRecord
からの計算で可能です。
Person.average('age'), Person.maximum(:age, :group => 'last_name'), Order.sum('total')
:これは現在すべて実装されています。 これのほとんどは追加のオプションで設定できます。これがまだコードにない場合は読んでください。
XMLまたはYAMLでのデータ出力は、XMLでの出力用の.rxml Builder-aテンプレートを作成するだけではありません。
ActiveRecord
は、結果をXMLで出力する
to_xml
メソッドがあります。 単純なオブジェクトだけでなく、テーブル全体でも動作します:
User.find(:all).to_xml
。 包含もサポートされています:
Post.find(:all, :include => [:comments]).to_xml
。
to_yaml
を使用したYAMLでも同じです。