49hack

見習いエンジニアが魔法使いになるまで

railsで使えるメソッドとかハマったところとか

ちょっとたまってきたのでメモがてらまとめます。

1. Hashを逆順にする

あるハッシュ

h = { "1" => "a", "2" => "c", "3" => "y", "4" => "x" }

を逆順の

{ "4" => "x", "3" => "y", "2" => "c", "1" => "a" }

にしたい場合、Arrayreverseが使えます。

reversed_h = Hash[h.to_a.reverse]

ruby2.1以降であればもっとカンタン。

reversed_h = h.to_a.reverse.to_h

2. or and|| &&の優先順位に注意

演算子の優先順位がちがうので想定外の結果になることがしばしば。。

[1] pry(main)> a = true and false
[2] pry(main)> a
=> true
[3] pry(main)> a = true && false
[4] pry(main)> a
=> false

たとえば、次のような予期せぬ結果を生みます。

true_and_false = true and false
if true_and_false
  puts "true"
else
  puts "false"
end
#=> true

Railsのハマりどころで有名らしいのですが、なかなか気付きにくい。。 基本的にand orを使う場合は()で囲むか、|| &&を使っていく方針が良さそう。

3. カレンダーとかセレクトボックスで便利なメソッド

all_monthを使えばd.beginning_of_month..d.end_of_monthみたいに長ったらしいメソッドを書かなくてすむ。

[6] pry(main)> d = Date.today
=> Sat, 13 Jun 2015
[7] pry(main)> d.beginning_of_month..d.end_of_month
=> Mon, 01 Jun 2015..Tue, 30 Jun 2015
[8] pry(main)> d.all_month
=> Mon, 01 Jun 2015..Tue, 30 Jun 2015

ほかにもall_week all_quarter all_yearがあります。

4. CSV.foreachで行数を取得する

たとえば、一行目をスキップしたい場合などに使えます。

require 'csv'

CSV.foreach('test.csv') do |csv|
  next if $. == 1
  ....
end

5. メソッド呼び出しをスマートに

オブジェクトのプロパティにアクセスする際、nilクラスの場合を考慮して以下のように書くことが多いのですが、

name = user.present? user.name : "名無しさん"

tryを使うともっとスマートに書けます。

name = user.try(:name) || "名無しさん" 

6. 値の有無チェックをスマートに

とりわけparamsの値チェックで重宝します。通常はpresent?で有無をチェックして、存在すればその値を入れますが、

name = params[:name].present? ? params[:name] : "名無しさん"

presenceを使うとスマートに書けます。

name = params[:name].presence || "名無しさん"

7. layoutをある条件で切り替えたい

単純にactionだけで切り替えるのではなく、特定の条件で(たとえばスマートフォンの場合だけ)レイアウトを変更したい場合は以下のようにします。

before_action set_hoge_layout

def set_hoge_layout
  self.class.layout "hoge" if request.mobile
end

今回は以上です。またたまってきたらまとめよう。

参考