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の仕様、一通り知らないといかんな。。。