Session : Symbols hash keys getting converted to literals keys in next request

github.com

issue自体は古いですが最近調べても同じ挙動でした(rails6)

ただ、memory cacheもredis cacheもリクエストの前後でkeyが変わったりしないので、sessionに複雑な構造を持たせる場合はプロジェクトの最初の方から対応しておかないとはまる。

https://github.com/rails/rails/blob/7-0-stable/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb#L90

やっぱりrails7でもまだご健在な仕様みたいです。

この現象に出会ったのは、ログイン前のショッピングカートをsessionに保存するという仕様のためでした。

ログイン後はもちろんDBなので、ログイン前後で実装が異なり2倍近いコストがかかります(いやそれ以上か?)。

mysqlにあるmemory engineみたいなのもAuroraには無い様子。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Reference.html

InnoDB ストレージエンジンを使用します

railsのコードの一行の長さが気になったのでrubocopでなんとかできないか考えてみた

typescriptやdartのプロジェクトだと市民権を得ているformatterがあるので何も迷わないと思いますが、 railsだとなんかみんな長く書く。

そこで
https://techracho.bpsinc.jp/hachi8833/2019_05_24/74318
の記事から

https://github.com/rubocop/rubocop/pull/6824/files

にたどり着いたが、ActiveRecordのscopeの改行がなんか嫌な感じがしたのでやめました。

これが

scope :with_books, lambda {
  includes(:books)
    .order(:order, :updated_at)
}

こんな感じで、lambdaが次の行に行きます。

scope :with_books,
  lambda {
    includes(:books)
      .order(:order, :updated_at)
}

これも慣れれば、気にならなくなるのか。。。?

MX Master 3 for macのジェスチャーボタンの動きがいきなり変わった。それとssl証明書問題

けど、Logi Optionsの再インストールで治った。

ジェスチャーボタンをmission controlに割り当てていてかなり便利だったが、 何かのタイミングで(もう一台のmacに繋いだ時か?)動きが変わって不便だった。

動きが変わったというのは、ジェスチャーボタンを押すたびに 別のブラウザに切り替わるというものでした。

バイスの追加・削除でも変化がなかった(Optionsに表示されなくなった) ので、再インストールしました。

あと、余談ですが、最近のchromeではssl証明書の更新漏れででサイトが見れなくなった時、キャッシュをクリアしないと、回避できない場合があるので、注意。

AWS cliとSession Managerをインストール

sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
Password:
env: python: No such file or directory

これならどうだ!

sudo python3 sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
Password:
Creating install directories: /usr/local/sessionmanagerplugin/bin
Creating Symlink from /usr/local/sessionmanagerplugin/bin/session-manager-plugin to /usr/local/bin/session-manager-plugin
Installation successful!

OK!

ecrからイメージをpullしてみる

前述の手順からecs execで中には入れたがデプロイ方法がわからないのでとりあえず、先輩がpushしたイメージをpullしてみることに

https://github.com/awslabs/amazon-ecr-credential-helper
というものが必要らしい

~/.docker/config.json

{
  "credsStore" : "desktop"
}

は削除してから、helperの設定を追加するのか。。。?

{
  "credsStore" : "desktop"
  "credHelpers": {
    "public.ecr.aws": "ecr-login",
    "<aws_account_id>.dkr.ecr.<region>.amazonaws.com": "ecr-login"
  }     
}

よくわからないので、こんな感じで並べておいてみることに

accepts_nested_attributes_for, FormOptionsHelper.selectのauxiliary hidden field

dhhがaccepts_nested_attributes_forをkillしたがってる件

https://github.com/rails/rails/pull/26976#pullrequestreview-8449983

代替としてはActiveModel内に頑張って書いていく

form helperのselectのauxiliary hidden field

https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/actionview/lib/action_view/helpers/form_options_helper.rb#L137-L143

multiple: trueにする場合は補助的なhiddenタグがデフォルトで追加されます。
この挙動が不要な場合はinclude_hidden: falseで無効にすることができます。

f:id:ta_watanabe:20220406225456p:plain

html.erb

<%= form_with do |form| %>
  <%= form.select("person_name", ["佐藤", "鈴木", "高橋"], {}, { multiple: true }) %>
<% end %>

htmlの出力結果

<form action="/home/form_options_helper_select" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="xxxx" autocomplete="off" />
  <input name="person_name[]" type="hidden" value="" autocomplete="off" /><select multiple="multiple" name="person_name[]" id="person_name"><option value="佐藤">佐藤</option>
<option value="鈴木">鈴木</option>
<option value="高橋">高橋</option></select>
</form>

rails cでも確認できる

[35] pry(main)> helper.select("post", "person_name", ["佐藤", "鈴木", "高橋"], {}, { multiple: true })
=> "<input name=\"post[person_name][]\" type=\"hidden\" value=\"\" autocomplete=\"off\" /><select multiple=\"multiple\" name=\"post[person_name][]\" id=\"post_person_name\"><option value=\"佐藤\">佐藤</option>\n<option value=\"鈴木\">鈴木</option>\n<option value=\"高橋\">高橋</option></select>"

開発中のプロジェクトでrails6 -> rails7にした

基本は

https://railsguides.jp/upgrading_ruby_on_rails.html

の手順を守ればOKですがdocker 環境のせいかbundle updateが一晩かけても終わらなかったので、Gemfile.lockを削除してGemfilerailsのバージョンを書き換えてbundle installしました。

変更点はこれだけです。

gem 'rails', '~> 6.1.4', '>= 6.1.4.1'
gem 'rails', '~> 7.0.2', '>= 7.0.2.2'

gem 'rails-i18n', '~> 6.0.0'
gem 'rails-i18n', '~> 7.0.0'

webpackerはとりあえず使い続ける選択をしたので大きな問題はありませんでした。

ただ、rspecでsessionをmockしているところが動かなくなってました

allow_any_instance_of(ActionDispatch::Request)
  .to receive(:session)
  .and_return({id: 1})

理由はちゃんとわかってないですが、下記のようなヘルパーを作って対処しました

  def initialize_mock_session
    mock_session = allow_any_instance_of(ActionDispatch::Request::Session)
    # おまじない。↓のエラーの対策
    # Please stub a default value first if message might be received with other args as well.
    mock_session.to receive(:[]).and_call_original
    mock_session
  end

# 利用方法
mock_session.to receive(:[]).with(:id).and_return(1)

Docker Desktopへのメモリの割り当てが少なかったせいか起動で失敗

環境:m1 mac

failed to solve: rpc error: code = Unknown desc = executor failed running

こんなエラーが出てapk adddocker-php-ext-installあたりのコマンドで落ちてたんですが、毎回必ず同じ場所で落ちるわけじゃなかったので、もしやと思ったらメモリの割り当てを8GBにしたらdocker compose upが最後まで通るようになりました。

m1 macを使ってると、インストールしようとしているパッケージが対応してないんじゃないかと疑いたくなりますが、今回は違いました。