実録!Railsのはまりポイント10選
- 2. 自己紹介
• 藤田 武雄
• 株式会社ドリコム
• ソーシャルゲーム事業本部
• アプリケーションエンジニア
• 最近は主に社内ライブラリの開発を
担当
Copyright © Drecom Co., Ltd.
- 5. はまり例
a = b or c
• こういう意味にしたかった
a = (b or c)
• 実際の動きは
(a = b) or c
• bの値をaに代入し、それが偽であればc
を評価する
Copyright © Drecom Co., Ltd.
- 7. ちなみにRails本体は
• Contributing to Ruby on Rails
• 5.3 Follow the Coding Conventionsに
は
• Prefer &&/¦¦ over and/or
• と書かれている
• http://guides.rubyonrails.org/
contributing_to_ruby_on_rails.html
Copyright © Drecom Co., Ltd.
- 11. lambdaを渡す
scope :started, lambda { where('start_at
<= ?', Time.now) }
• lambdaの中身は都度評価される
• edgeではwhereを直接書くやり方は
deprecatedとなった
• https://github.com/rails/rails/commit/
0a12a5f8169685915cbb7bf4d0a7bb48
2f7f2fd2
Copyright © Drecom Co., Ltd.
- 14. よくない例
class Baz
def self.foo
@foo ||= bar
end
end
• barがDBから取得した値だとDBを更新
しても返り値が変化しない!
Copyright © Drecom Co., Ltd.
- 21. 対策
• その1: validates_length_ofを設定
• その2: 文字数を減らす
• その3: mediumtext(16MBまで)などに
変更する
• どれぐらい増えるか見積もりしておけば
はみ出ないように設計見直しできるはず
• AR::Store(YAML)にも気をつけよう
Copyright © Drecom Co., Ltd.
- 25. パッチ
module ActiveRecord
module ConnectionAdapters
module SchemaStatements
def index_name(table_name, options)
if Hash === options
if options[:column]
"#{Array.wrap(options[:column]) * '_and_'}"
elsif options[:name]
options[:name]
else
raise ArgumentError, "You must specify the index name"
end
else
index_name(table_name, :column => options)
end
end
end
end
end
Copyright © Drecom Co., Ltd.
- 37. コード例
CREATE TABLE IF NOT EXISTS
tmp_scores LIKE scores;
TRUNCATE TABLE tmp_scores;
class TmpScore < ActiveRecord::Base; end
TmpScore.import([:user_id, :value, :rank],
scores)
RENAME TABLE scores TO scores_old,
tmp_scores TO scores;
DROP TABLE scores_old;
Copyright © Drecom Co., Ltd.
- 41. double submit protection
• 二重送信を検知してくれるplugin
• 二重送信を防ぎたいフォーム(orリンク)
のあるページでsessionにtokenを保存
し、パラメータにも同じ物をつける
• 次のページでは両者を付きあわせて、
session内のtokenを無効にする
Copyright © Drecom Co., Ltd.
- 43. 処理の流れ
user app session memcache
request load
write
ココが問題
response write
Copyright © Drecom Co., Ltd.
Editor's Notes
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n