ヒントずコツ

ほずんどすべおのプログラミング蚀語では、同じ問題をいく぀かの方法で解決できたす。 ただし、それらのいく぀かはより良く、いく぀かはより悪いです。 10行のコヌドを曞く必芁がある人もいれば、1行で解決できる人もいたす。



コヌドの改善ず最適化には、最初のバヌゞョンを䜜成するよりも時間がかかる堎合がありたす。 新しいコヌドや興味深い実装に頻繁に䌚っお、自分にこう蚀いたした「これは暙準的な手段を䜿っおできるこずがわかったが、私は自転車を発明した」 個人的にはそうです。 したがっお、この蚘事では「自転車」のコレクションをたずめ、それらを取り陀く方法を説明したした。



配列メ゜ッド



簡単な䟋-Userクラスのオブゞェクトの配列があるずしたしょう。 ナヌザヌには、アクティブ化されたプロパティがあり、ナヌザヌがアカりントをアクティブ化した堎合は1に蚭定されたす。 アレむのすべおのナヌザヌがアクティブ化されおいるかどうかを確認する必芁がありたす。 ActiveRecordを考慮しおいたせん別の方法がありたす、私の目暙は配列の操䜜方法を瀺すこずです。



最初の方法、最も原始的な

  1. @users = User. find ( :all ) activated_users = 0 foreach user in @users activated_users + = 1 if user. activated == 1 end # , activated_users == @users . size



  2. @users = User. find ( :all ) activated_users = 0 foreach user in @users activated_users + = 1 if user. activated == 1 end # , activated_users == @users . size



  3. @users = User. find ( :all ) activated_users = 0 foreach user in @users activated_users + = 1 if user. activated == 1 end # , activated_users == @users . size



  4. @users = User. find ( :all ) activated_users = 0 foreach user in @users activated_users + = 1 if user. activated == 1 end # , activated_users == @users . size



  5. @users = User. find ( :all ) activated_users = 0 foreach user in @users activated_users + = 1 if user. activated == 1 end # , activated_users == @users . size



  6. @users = User. find ( :all ) activated_users = 0 foreach user in @users activated_users + = 1 if user. activated == 1 end # , activated_users == @users . size



  7. @users = User. find ( :all ) activated_users = 0 foreach user in @users activated_users + = 1 if user. activated == 1 end # , activated_users == @users . size





ここで最初にしたこずは、ルヌプではなく各配列メ゜ッドを䜿甚するこずでした。

  1. @users =ナヌザヌ。 怜玢  すべお 
  2. activate_users = 0
  3. 私は個人的にこの蚘録方法が奜きです、
  4. 倚くの蚀語の暙準foreachルヌプより
  5. @users それぞれ が | ナヌザヌ|
  6. activate_users + = 1ナヌザヌの堎合。 有効化 == 1
  7. 終わり
  8. たたは1行で
  9. @users 各 { | ナヌザヌ| activate_users + = 1ナヌザヌの堎合。 有効化 == 1 }
しかし、この蚘録でさえ埌で私に合わなかった。 より合理的なオプションを芋぀けたした

  1. selectメ゜ッドを䜿甚するず、特定の条件に埓っお配列の芁玠を匕き出すこずができたす
  2. そしお、䞡方の配列のサむズを比范したす
  3. @users =ナヌザヌ。 怜玢  すべお 
  4. @users { | ナヌザヌ| ナヌザヌ アクティベヌト == 1 } 。 サむズ == @users 。 サむズ
ただし、すべおの優れたものがすでに発明されおいるので、ドキュメントを読んでください。 配列には玠晎らしいすべおがありたすかすべおの芁玠が条件を満たすかどうかを確認するメ゜ッド。 ずころで、少なくずも1぀の芁玠が条件に䞀臎する堎合にtrueを返すanyメ゜ッドがただありたす。



コヌドはすべお1行で蚘述できたす。

  1. @users すべお  { | ナヌザヌ| ナヌザヌ 有効化 == 1 }
  2. たたはこのように
  3. @users すべお    activate  activateがtrue / falseに蚭定されおいる堎合、 Rubyの0はtrueず芋なされたす


さらに、あたり知られおいないが䟿利な方法がいく぀かありたす。

  1. 最初の5぀の芁玠を取埗する
  2. @array 。 取る  5 
  3. ランダムなアむテムを遞択
  4. @array 。 遞択
  5. アむテムをランダムに散垃する
  6. @array 。 シャッフル 
  7. 番号で配列芁玠を取埗
  8. さらに、このメ゜ッドは@array [1]よりも高速に動䜜したす
  9. @array 。  1 


配列内の芁玠の数を数える最良の方法は䜕ですか




カりントが最も機胜的です。 括匧内のパラメヌタヌを指定できたす。

  1. 配列= [ 1、1、2、2、3、4、5 ]
  2. 配列 カりント => 7
  3. 配列 count  1  芁玠の数をカりントしたす "1" => 2
  4. 配列 カりント { | p | p > 2 } 条件ごずに芁玠をカりントしたす=> 3




サむズたたは長さ 配列で同じは、すべおの芁玠の数を単玔にカりントするこずだけが目的なので、最も速い方法です。



頻繁に䜿甚されるActiveRecordク゚リ



私が出䌚ったもう1぀の「バむク」は、 名前付きスコヌプの独自の実装です。 たずえば、Carsテヌブルがありたす。 倚くの堎合、基地に行き、特定の色の車を匕き出す必芁がありたす。 モデルに独自のメ゜ッドを曞くこずができたす

  1. クラス Car < ActiveRecord :: Base
  2. デフセルフ 。 only_red
  3. 自己 。 find  all 、conditions => "color = 'red'" 
  4. 終わり
  5. 終わり
圌はすべおの赀い車を探しおいたす。 圌に目を向けるのは簡単です-Car.only_red。 しかし、䞻な欠点は、すべおを敎理する堎合たたは、limit => 5などを远加する堎合、モデル内のメ゜ッドを倉曎するか、暙準のfindを䜿甚する必芁があるこずです。



非垞に䟿利で䜿いやすいnamed_scopeが助けになりたす。

  1. クラス Car < ActiveRecord :: Base
  2. named_scope 赀 、 条件 => '色= "èµ€"'
  3. 終わり


Car.red-ほが同様に䜿甚したす。 ただし、これに加えお、findメ゜ッドず組み合わせお䜿甚​​するこずもできたす。䟋
  1. 車。 èµ€ 。 find  all 、limit => 10 、order => "id DESC" 
そしお、それらを組み合わせるこずができたす。 最初に、マシンを所有するナヌザヌをリク゚ストに含めるこずができる新しいスコヌプを远加したす。

  1. named_scope with_users ,: include => users


これでCar.red.with_usersがノりハりク゚リを䜜成したす。 䟿利ですか 間違いなく。



Link_toず圌の友達



最も䞀般的なlink_toリンクには、さらに興味深い類䌌物がいく぀かありたす。



1぀目はlink_to_ifで、条件に䞀臎した堎合にのみリンクを出力したす。 䞀臎しない堎合、リンクはなく、テキストのみがその堎所に残りたす。

たずえば、「カルマを䞊げる」ずいうリンクがありたす。 ナヌザヌがすでに投祚しおいる堎合は、利甚できたせん。 この目的のために別のスタむルを䜜成し、リンクをプレヌンテキストずしお衚瀺するものもありたす。 しかし、あなたは曞くこずができたす

  1. link_to_if  user。voted_for_karma == false  、 "カルマを䞊げる "、 action => "add_karma"
ここで䜕を倉曎できたすか もちろん、user.voted_for_karma== falseは明確に芋えたせん。link_to_unlessを䜿甚しおfalseずの比范を簡単に削陀できるためです。

  1. link_to_unlessナヌザヌ。 voted_for_karma 、 "Raise Karma "、 action => "add_karma"
さらにクヌルにするこずができたす-ナヌザヌが既に投祚しおいるずしたしょう。

  1. ここでlink_nameは元のリンクの名前ずしお䜿甚されたす䜿甚されたせん
  2. link_to_unless  user。voted_for_karma 、 "Raise karma "、 action => "add_karma"  { | link_name | 「あなたはすでに投祚しおいたす」 }
たた、ナヌザヌがログむンしおいない堎合、たずえば登録にリダむレクトするなど、別のリンクを指定するこずもできたす。

  1. link_to_if  user。logged_in 、 "トピックの䜜成 "、 action => "add_post"  do | link_name |
  2. ログに蚘録されおいないナヌザヌがリンクをクリックするず、ログむンペヌゞに移動したす
  3. link_to  link_name ,: controller => "users" 、 action => "login" 
  4. 終わり


ブラりザヌが珟圚のペヌゞにある堎合、リンクのテキストぞの眮換を芋るこずができたす。 これはlink_to_unless_currentを䜿甚しお行われたす

  1. <-index.html.erb->
  2. < ul id = "navbar" >
  3. < li > < = link_to_unless_current  "Home" 、 {  action = > "index"}> < / li >
  4. < li > < = link_to_unless_current  "About Us" 、 {  action = > "about"}> < / li >
  5. < / / ul >
  6. <-About Usペヌゞに移動するず、htmlコヌドに次のように衚瀺されたす。->
  7. < ul id = "navbar" >
  8. < li > <a href = "/ controller / index">ホヌム< / a > < / li >
  9. < li >䌚瀟抂芁< / i >
  10. < / / ul >




怜蚌のロシア化



私がか぀お遭遇した別の問題は、怜蚌ず゚ラヌです。 私のアプリケヌションはもちろんロシア語で、デフォルトでは次の圢匏で゚ラヌが発行されたした「タむトルを空にするこずはできたせん。」



たず、ロシアのgemをむンストヌルする必芁がありたす。それに぀いお既に知っおいるこずを本圓に願っおいたす。 これにより、ほずんどの暙準メッセヌゞがロヌカラむズされたす。

次にconfig / localesフォルダヌでru.ymlファむルを開くたたは䜜成しない堎合は䜜成する必芁がありたす。 これが私のファむルの䟋です

  1. ru
  2. activerecord
  3. ゚ラヌ 
  4. full_messages
  5. レヌト
  6. exists 「同じナヌザヌを2回評䟡するこずはできたせん」
  7. number_limit 「評䟡は-2から2たでの倀を取るこずができたす」
  8. 属性
  9. ニュヌス
  10. タむトル 「タむトル」
  11. 本文 「テキスト」
  12. 蚘事 「蚘事」
ご芧のずおり、ニュヌステヌブルのタむトルフィヌルドをロヌカラむズするには、䞊蚘のレコヌドをロヌカラむズファむルに远加したす。



full_messagesフィヌルドは、完党な゚ラヌメッセヌゞに䜿甚されたす。 モデルぞの適合方法は次のずおりです。

  1. クラス Rate < ActiveRecord :: Base
  2. validates_uniqueness_of rate_owner_id ,: message => "rate.exists"
  3. validates_inclusion_of value 、 in => [ -2 、 -1、1、2 ] 、 message => "rate.number_limit"
  4. 終わり
messageパラメヌタヌはロヌカラむズファむルを取埗し、アドレスactiverecord.errors.full_messagesに移動しおから、モデルで指定された堎所に移動し、ロヌカラむズされた文字列を返したす。 すべおが非垞に簡単です。 メッセヌゞを指定しない堎合、出力は暙準の゚ラヌフレヌズになりたすが、私の堎合は、それを私のものに眮き換えたした。



コントロヌラヌのメ゜ッド



ajaxず旧匏の䞡方の方法でアクションでデヌタを返す必芁がある堎合、request.xhrを䜿甚しお確認できたす。次に䟋を瀺したす。

  1. def怜玢
  2. @users =ナヌザヌ。 find  all 、conditions => "login LIKE '{params [q]}'"、 limit => 30 
  3. render json => @users if request xhr 
  4. 終わり
別の䟿利な方法は怜蚌です。 名前から刀断するず、正しい芁求がコントロヌラヌに届いたこずを確認するのに圹立ちたす。 これは䞻に保護のためであり、䞀郚の方法では䜿甚するこずを匷くお勧めしたす。

  1. クラス UsersController < ApplicationController
  2. createメ゜ッドを確認したす-post芁求ず指定されたパラメヌタヌのみを受け入れる必芁がありたす。
  3. 䜕か問題がある堎合は、ナヌザヌを先頭にリダむレクトし、フラッシュ゚ラヌメッセヌゞを远加したす。
  4. verify only => create 、 method => post 、params => [ login 、email ,: name ] 、 redirect_to => index 、add_flash => { error => 'Invalid request。 倧䞈倫ですか」 }
  5. 終わり
ずころで、可胜な限り詳现に゚ラヌをペむントするべきではありたせん-䞻な怜蚌はモデルで行われるべきです。 ここでパラメヌタをチェックし、䜕か問題がある堎合は誓いたす。



デバッグ



アプリケヌションのデバッグには、ロガヌずruby-debug gemを䜿甚したす。 ロガヌは、「ナヌザヌの代わりに圌が䜕を返すのか」を簡単にすばやく芋぀ける方法です。 それは単玔に行われたす

  1. コン゜ヌルにオブゞェクトを䟿利に衚瀺するために呌び出す
  2. ロガヌ。 debug "users ={users.inspect}"
ずころで、logger.debugだけでなく、logger.info、logger.warn、たたはlogger.fatalを䜿甚するこずもできたす。 RAILS_DEFAULT_LOGGER.debugは、logger.debugずいうフレヌズに応答しないため、独自のクラスで䜜成できたす。



倉数の状態を確認たたは倉曎する必芁がある堎合は、デバッガヌを䜿甚できたす。 これを行うには、たずえば次のようにデバッガ゚ントリを配眮したす。

  1. クラス UsersController < ApplicationController
  2. defむンデックス
  3. @user =ナヌザヌ。 find_by_id  params [ id ] 
  4. role = @user 。 圹割
  5. デバッガヌ
  6. 終わり
  7. 終わり
その埌、-debuggerパラメヌタヌでサヌバヌを起動するか、远加する必芁がありたす
  1. 「ruby-debug」 が必芁
environment.rbで。 その埌、ブラりザでむンデックスペヌゞを曎新したすが、停止し、ロヌドされたせん。 コン゜ヌルを芋る時が来たした。そこでデバッガを埅っおいたす。

  1. rdb1irb
  2. irb<UsersController0x1039edd20>0010> @user
  3. =><ナヌザヌID1、ログむン "Vizakenjack">
  4. irb<UsersController0x1039edd20>0010> @ user.login = 'Admin'
  5. =>「管理者」>


たずirbに進み、次に倉数を芋おください。 衚瀺に加えお、それらを倉曎しおから、アプリケヌションに入れるこずができたす。



デバッガに関する本党䜓を曞くこずができたす。ここでは、基本的な䜿甚䟋のみを瀺したした。 「すべおを䞀床に」したい人のために-以䞋の段萜のリンクを読んでください。

おわりに





ここで、私を助けおくれたいく぀かの䟿利なリンクを提䟛したす。そしお、あなたにも圹立぀こずを願っおいたす。




All Articles