String#squish
ActiveSupportで定義されているらしい。
1def squish
2 dup.squish!
3end
4
5def squish!
6 gsub!(/[[:space:]]+/, " ")
7 strip!
8 self
9end
halt_callback_chains_on_return_false がDeprecatedになった件でプルリク見てたら書いてあってみつけた。
deprecate halt_callback_chains_on_return_false instead of `halt_and… · rails/rails@4e63ce5
1ActiveSupport::Deprecation.warn(<<-MSG.squish)
2 ActiveSupport.halt_callback_chains_on_return_false is deprecated and will be removed in Rails 5.2.
3MSG
ヒアドキュメントの余計な空白とか消すのに使うんだね。
window_opened_by
Capybaraでリンクをクリックしたときに別タブが開いて、みたいなときに使えるメソッドがあった。
Method: Capybara::Session#window_opened_by — Documentation for jnicklas/capybara (master)
within_windowと組み合わせて使える。
Method: Capybara::Session#within_window — Documentation for jnicklas/capybara (master)
こんな感じ。
1scenario do
2 visit root_path
3 window = window_opened_by { click_lick '新しいタブで開く' }
4 within_window(window) do
5 expect(page).to have_content '新しいタブだよ'
6 end
7end
remote_ip
接続元のIPでアクセス制限するみたいなコードを書く時に、request.remote_ipを使ってました。環境構成がシンプルなときはそれでいけてました。
remote_ip (ActionController::Request) - APIdock
最近触ったアプリケーションが、CloudFrontを通ったりなんだりいろいろ経由してからRailsに到達する構成だったので接続元(ユーザーの環境)のIPがremote_ipで取れないことがありました。
調べてみると、経由した順にrequest.headers['X-Forwarded-For']にカンマ区切りで入っていることが判明。環境に合わせて取り出せるように、こんな風にしてIPを取り出せることがわかりました。
1def client_ip
2 @client_ip ||= (request.headers['X-Forwarded-For'].to_s.gsub(' ', '').split(',').first || request.remote_ip)
3end
HTTP_X_FORWARDED_FORに入ってるんですねー。HTTPの仕様、一通り知らないといかんな。。。