railsがんばる子

Ruby on Railsがんばる子です。胡蝶蘭のECサイトを運営しています。

指摘事項

ハッシュの時は、両端に余分なスペースを入れない

ハッシュの時は、両端に余分なスペースを入れない {hoge: 1} 逆に、ブロックの時は入れる hoge.each{ |item| do_something }

partial templateにクラス変数は使わないこと

@hogeみたいなクラス変数をpartial templateに使うと、同じ命名のクラス変数を定義しないとそのpartial templateが使えなくなってしまうので、やめたほうがいいです。 やってしまって、恥ずかしいです。

ruby リファクタリングするときとか、まず見る

[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか - Qiita [初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか - Qiita

中間テーブルの命名について

中間テーブルは基本、多対多のモデルの関連をつくるために用いているので、 中間テーブル自体は意味のあるデータを持つことは少ない。 XyzToAbcというモデル名を見ると、「中間テーブル」だと推測できます。

渡された引数はなるべく変更しない。

関数を定義する際、渡された引数はなるべく変更しないようにする。 イミュータブルな関数を作りなさい。ということですね! 副作用はよろしくないです、はい。

用語集を作る

似た様な用語がたくさんあったり、時と場合により用語が変わってる場合(ほとんどの場合が気分で変わっている)、用語集を提案するとよい。

ActiveRecord::Relationを返すならscope

def self.availables where(available: true) end scope :availables, -> { where(available: true) } scopeチェーンできるもの(ActiveRecord::Relationが返るもの)はscopeで、 Relation以外の戻り値を返すものは、クラスメソッドに整理しておけば、 新しく…

名前検索と、条件検索はメソッド分ける。

名前検索と、条件検索はメソッド分ける。 def search(conditions = {}) if conditions[:name].present? where(name: :name) else where(status: :status) end end def search_by_name(name) where(name: name) end def search_by(conditions = {}) where(con…

設定する値とパラメータの名前は合わせた方がbetter

@hoge.begin_date=params[:begin_datetime] ではなく、 @hoge.begin_date=params[:begin_date]

routes.rbについてバグ注意

railsでupdateを実装してリリースしたところ、既存機能が動かなくなるバグを出してしまった。 原因はconfig/routes.rbでした。 config/routes.rb resources :foos, only: [:index, :create, :update] #<- ここにupdateを足しました。 patch 'foos/bar' route…

オブジェクトがたくさんできそうなときはシングルトンを検討する

メモリ上にたくさんクラスができるから?らしい。 そういうのってJavaではgaverage collectionの対象になってた気がするけど、rubyではならないので自分で気にしてあげなきゃいけないってこと? でも、それだと色々なクラスでやばいことになりそうだが...

sendという関数名はObjectクラスにもあり、メタプロを連想させるためなるべく別の名前を使う

メモ。 Blog Alpha Networking: Rubyのメタプログラミング技術

例外が発生する処理はかならずbegin - rescue - endが必要

begin ... do something rescue NanikaError=> e logger.error(e) .. do something end

helper内でwhereするとincludesで先読みしててももう一度SQLを投げてしまう

xxx_helper.rb def help(status) nanika = @nanika.where(status: status) .... end これだと、キャッシュされたActiveRecord::Relationを利用せずにまたSQLを投げてしまう なので、rubyのfindを使ってみた。 これでいいのか謎だけど、とりあえずSELECTが発…

インスタンスに対する操作というより、集合の取得処理はクラスメソッド(def self.xxx)にする

インスタンスに対する操作というより、集合の取得処理はクラスメソッド(def self.xxx)にする model.rb インスタンスメソッドで書く場合 class Model def find_one Model.find(1) end end ではなく、 クラスメソッドで書く class Model def def.find_one Mod…

メソッドを呼び出す時に()を省略しない

sort_by &:id ではなく sort_by(&:id)

無駄な空行が無いようにする

+ def something + do something .... + do something .... + do something .... + end + + ではなく、 + def something + do something .... + do something .... + do something .... + end +

カンマの後にスペースを入れる

a,b,c ではなく、 a, b, c

case-whenのインデントは無し

case plan when :plan_a ...do something when :plan_b ...do something end ではなく case plan when :plan_a ...do something when :plan_b ...do something end

ロケットハッシュ( key=>value )はなるべく使わない

"key" => "value" ではなく key: "value

"search.#{ name }"このスペースはいらない

"search.#{ name }" "search.#{name}"

例外がおきたらlogger.errorする

begin .... rescue e => logger.error(e) .... end

なるべく説明変数つかって分かりやすく書く

CSV.foreach(Rails.root.join('a', 'b', 'c', 'data.csv')) do |record| path = Rails.root.join('db', 'b', 'c', filename='data.csv' ) CSV.foreach(path) do |record|

余計なrequireはしない

Railsではmoduleが自動読み込みされるのでrequireが不要。 Rails では、自動読み込みは RAILS_ROOT/app/models のような RAILS_ROOT/app/ の中のディレクトリに対し行われます。 RAILS_ROOT/lib とかに配置しても自動読み込みされません。 Rails の自動読み…

modelに関連を付けるときの注意点

dependent: :destroyを付けるかどうかを考えること

複数行のeachはブロック({})ではなくて do-endを使う

(0..6).each{ |weekday_type| ...something ...something ...something } 複数行のeach はブロックではなく (0..6).each do |week_type| ...something ...something ...something end