LoginSignup
17
7

More than 3 years have passed since last update.

Ruby on Railsでの良い書き方について

Last updated at Posted at 2019-12-14

皆さん、こんにちは。新卒のズオンです。
この記事はLinkbal(リンクバル)Advent Calendar 2019の14日目の記事です。
今回はRuby on Railsでの良い書き方を紹介します。 おそらく多くの人が既にこれらの書き方について知っていますが、私にとっては非常に便利だと思うので皆と共有したいです。 皆様からの提案をお待ちしております。 始めましょう。:smile:

Hash

dig

私たちはほとんどしばしばこのように書きます:

if users[:id] && users[:id][:age] && users[:id][:age][:address]
  ...
end

Hash#Digを使用すると、nil参照を心配することなくて簡単に動的にアクセスできます。 この書き方が短くて、結果は変わりません。

if user.dig :id, :age, :address
  ...
end

Object

&.

例えばユーザーの住所があるかどうかを確認するとします。次のように書くことがよくあります。


if user && user.address
  ...
end

&.を使用して上記のコードを書き換えることができます。


if user&.address
  ...
end

presence_in

もしブール条件の結果が実際に必要ない場合は、条件をメソッドに置き換えることができます。

colors = [:red, :green, :blue]
color = colors.include?(params[:color]) ? params[:color] : :pink

または


color = (colors.include?(params[:color]) && params[:color]) || :pink

下の書き方はもっと良くなります。


params[:color].presence_in(colors) || :pink

presence

もしオブジェクトに ""または []があるかどうかをチェックしたい場合は
このような代わりに:

prefecture = params[:prefecture] if params[:prefecture].present?
area = params[:area] if params[:area].present?
region = prefecture || area || 'JP'

このように使ってください。

params[:prefecture].presence || params[:area].presence || 'JP'

Array

zip

例えば同じ数の要素を持つ2つの配列があり、この配列の要素をキーに変換し、他の配列の要素を対応する値に変換したい場合、次のようにします。

arr_1 = ["1", "2", "3"]
arr_2 = ["a", "b", "c"]

Hash[arr_1.zip arr_2] # => {"1" => "a", "2" => "b", "3" => "c"}

any?とall?

少なくとも1つの要素が条件を満たす場合にtrueを返したい時にany?を使ってください。

arr = [2, 3, 4]
arr.any? { |n| n > 3 }
# => true
arr.any? { |n| n > 4 }
# => false

すべての要素が条件を満たす場合にtrueを返したい場合は、all?を使用してください。

arr = [2, 3, 4]
arr.all? { |n| n > 1 }
# => true

any?(&:blank?)とall?(&:blank?)

配列はnilとか""の要素があるかどうか確認したいときに

arr = Array.new([1, 2, nil, ""])
arr.any?(&:blank?) # => true 

以外に配列は全ての要素がnilとか""あるかどうかチェックしたい場合に

["", nil].all?(&:blank?) # => true
[1, 2, "", nil].all?(&:blank?) # => false

selectとreject

条件を満たす要素を返す。

[1, 2, 3, 4].select{ |n| n > 2 }

# => [3, 4]

条件を満たさない要素のみを選択するには、selectの代わりにrejectを使用できます。

[1, 2, 3, 4].reject{ |n| n > 2 }

# => [1, 2]

count

条件を満たす要素の数を返します。

arr = [1, 2, 3, 4, 4, 7, 7, 7, 9]
arr.count { |i| i > 5 }
# => 4

compact

配列内のnil要素を削除します。

numbers_and_nil = [1, 2, 3, nil, nil, 6]
only_numbers = numbers_and_nil.reject(&:nil?) # => [1, 2, 3, 6]

上記の書き方代わりに下記のようにもっと良くなります。

numbers_and_nil = [1, 2, 3, nil, nil, 6]
only_numbers = numbers_and_nil.compact         # => [1, 2, 3, 6]

sample

ランダム要素を返します。

users[rand(users.size)]
# 同じに
users.sample

String


# snake_caseをcamel_caseに変換します
"my_book".camelize # => "MyBook"

# snake_caseになります
"MyBook".underscore # => "my_book"

# kebab_caseになります
"my_book".dasherize # => "my-book"

# 複数形になります
"book".pluralize            # => "books"
"account".pluralize         # => "accounts"
"ruby".pluralize            # => "rubies"
"tooth".pluralize           # => "teeth"

# 単数になります
"books".singularize            # => "book"
"customers".singularize        # => "customer"
"wolves".singularize           # => "wolf"

# クラス名に変換します(camel_case + 単数形)
"my_book".classify  # => "MyBook"
"my_books".classify # => "MyBook"

# テーブル名に変換します(snake_case + 複数形)
"my_book".tableize # => "my_books"
"MyBook".tableize  # => "my_books"

# 不要なスペースを削除します
"    My    \r\n  \t   \n   book      ".squish # => "My book"

Stringの短縮メソッドについて詳しく知りたい場合は、https://apidock.com/rails/String を参考してください。

おわりに

上記で私が知っているHashObjectArrayStringメソッドのいくつか良い書き方を紹介しました。 もちろんもっと良い書き方がたくさんあるので皆様からの提案をお待ちしております。読んでくれてありがとうございます。 またね。:raised_hand:

参考

https://apidock.com/rails/String
https://api.rubyonrails.org/

17
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
7